From e1799cbe222913f4c9718ab58a66d6dc3bd910f1 Mon Sep 17 00:00:00 2001 From: Ducnv Date: Wed, 21 Aug 2024 12:08:27 +0700 Subject: [PATCH 1/8] - fix: ControlPanel - Remove: GameDataEditor - Changed: Color Control panel --- .../Editor/AssetFinderWindowAll.cs | 8 ++--- VirtueSky/ControlPanel/CPUtility.cs | 4 +-- .../ControlPanel/ControlPanelWindowEditor.cs | 31 +++---------------- .../DataStorage/Editor/GameDataEditor.cs | 26 ---------------- .../DataStorage/Editor/GameDataEditor.cs.meta | 11 ------- 5 files changed, 10 insertions(+), 70 deletions(-) delete mode 100644 VirtueSky/DataStorage/Editor/GameDataEditor.cs delete mode 100644 VirtueSky/DataStorage/Editor/GameDataEditor.cs.meta diff --git a/VirtueSky/AssetFinder/Editor/AssetFinderWindowAll.cs b/VirtueSky/AssetFinder/Editor/AssetFinderWindowAll.cs index bcdab82e..8000dfa6 100644 --- a/VirtueSky/AssetFinder/Editor/AssetFinderWindowAll.cs +++ b/VirtueSky/AssetFinder/Editor/AssetFinderWindowAll.cs @@ -732,10 +732,10 @@ protected void OnGUI2() return; } - EditorGUI.DrawRect(new Rect(0, 0, position.width, position.height), - GameDataEditor.ColorBackgroundRectWindowSunflower.ToColor()); - GUI.contentColor = GameDataEditor.ColorTextContentWindowSunflower.ToColor(); - GUI.backgroundColor = GameDataEditor.ColorContentWindowSunflower.ToColor(); + // EditorGUI.DrawRect(new Rect(0, 0, position.width, position.height), + // GameDataEditor.ColorBackgroundRectWindowSunflower.ToColor()); + // GUI.contentColor = GameDataEditor.ColorTextContentWindowSunflower.ToColor(); + // GUI.backgroundColor = GameDataEditor.ColorContentWindowSunflower.ToColor(); if (sp1 == null) InitPanes(); DrawHeader(); diff --git a/VirtueSky/ControlPanel/CPUtility.cs b/VirtueSky/ControlPanel/CPUtility.cs index bd9cdfb4..dabaf5a8 100644 --- a/VirtueSky/ControlPanel/CPUtility.cs +++ b/VirtueSky/ControlPanel/CPUtility.cs @@ -31,7 +31,7 @@ public static void DrawButtonInstallPackage(string labelInstall, string labelRem } } - GUI.backgroundColor = GameDataEditor.ColorContentWindowSunflower.ToColor(); + GUI.backgroundColor = Color.white; GUILayout.Space(10); GUILayout.Toggle(isInstall, TextIsInstallPackage(isInstall)); @@ -57,7 +57,7 @@ public static void DrawButtonAddDefineSymbols(string flagSymbols, float withButt EditorScriptDefineSymbols.SwitchFlag(flagSymbols); } - GUI.backgroundColor = GameDataEditor.ColorContentWindowSunflower.ToColor(); + GUI.backgroundColor = Color.white; GUILayout.Space(10); GUILayout.Toggle(isAddSymbols, TextIsEnable(isAddSymbols)); diff --git a/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs b/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs index 5d9741f4..642a0ded 100644 --- a/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs +++ b/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs @@ -44,12 +44,12 @@ private void OnDisable() private void OnGUI() { - EditorGUI.DrawRect(new Rect(0, 0, position.width, position.height), - GameDataEditor.ColorBackgroundRectWindowSunflower.ToColor()); + // EditorGUI.DrawRect(new Rect(0, 0, position.width, position.height), + // CustomColor.Aqua.ToColor()); GUILayout.Space(10); - GUI.contentColor = GameDataEditor.ColorTextContentWindowSunflower.ToColor(); + // GUI.contentColor = CustomColor.Aquamarine.ToColor(); GUILayout.Label("SUNFLOWER CONTROL PANEL", EditorStyles.boldLabel); - GUI.backgroundColor = GameDataEditor.ColorContentWindowSunflower.ToColor(); + // GUI.backgroundColor = CustomColor.Gold.ToColor(); Handles.color = Color.black; Handles.DrawAAPolyLine(4, new Vector3(0, 30), new Vector3(position.width, 30)); // GuiLine(2, Color.black); @@ -154,29 +154,6 @@ void DrawContent() } } - #region Setup theme color - - void OnSettingColorTheme() - { - GameDataEditor.ColorContentWindowSunflower = - (CustomColor)EditorGUILayout.EnumPopup("Color Content:", - GameDataEditor.ColorContentWindowSunflower); - GameDataEditor.ColorTextContentWindowSunflower = - (CustomColor)EditorGUILayout.EnumPopup("Color Text Content:", - GameDataEditor.ColorTextContentWindowSunflower); - GameDataEditor.ColorBackgroundRectWindowSunflower = - (CustomColor)EditorGUILayout.EnumPopup("Color Background:", - GameDataEditor.ColorBackgroundRectWindowSunflower); - GUILayout.Space(10); - if (GUILayout.Button("Theme Default")) - { - GameDataEditor.ColorContentWindowSunflower = CustomColor.Bright; - GameDataEditor.ColorTextContentWindowSunflower = CustomColor.Gold; - GameDataEditor.ColorBackgroundRectWindowSunflower = CustomColor.DarkSlateGray; - } - } - - #endregion void DrawButtonChooseState(string title, StatePanelControl _statePanelControlTab) { diff --git a/VirtueSky/DataStorage/Editor/GameDataEditor.cs b/VirtueSky/DataStorage/Editor/GameDataEditor.cs deleted file mode 100644 index 4693a422..00000000 --- a/VirtueSky/DataStorage/Editor/GameDataEditor.cs +++ /dev/null @@ -1,26 +0,0 @@ -using UnityEditor; -using VirtueSky.Inspector; - -public partial class GameDataEditor -{ - public static CustomColor ColorContentWindowSunflower - { - get => (CustomColor)EditorPrefs.GetInt("ColorContent_Windows_Sunflower", - (int)CustomColor.Bright); - set => EditorPrefs.SetInt("ColorContent_Windows_Sunflower", (int)value); - } - - public static CustomColor ColorTextContentWindowSunflower - { - get => (CustomColor)EditorPrefs.GetInt("ColorTextContent_Windows_Sunflower", - (int)CustomColor.Gold); - set => EditorPrefs.SetInt("ColorTextContent_Windows_Sunflower", (int)value); - } - - public static CustomColor ColorBackgroundRectWindowSunflower - { - get => (CustomColor)EditorPrefs.GetInt("ColorBackground_Windows_Sunflower", - (int)CustomColor.DarkSlateGray); - set => EditorPrefs.SetInt("ColorBackground_Windows_Sunflower", (int)value); - } -} \ No newline at end of file diff --git a/VirtueSky/DataStorage/Editor/GameDataEditor.cs.meta b/VirtueSky/DataStorage/Editor/GameDataEditor.cs.meta deleted file mode 100644 index c30b25ba..00000000 --- a/VirtueSky/DataStorage/Editor/GameDataEditor.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 442ff10232d004a4994b09125f4bd755 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From d2645f6a294739771fa86beae65f160e6f0ccbd0 Mon Sep 17 00:00:00 2001 From: Ducnv Date: Wed, 21 Aug 2024 20:50:36 +0700 Subject: [PATCH 2/8] - fix control panel - p1 --- .../Advertising/Editor/AdSettingEditor.cs | 2 +- VirtueSky/ControlPanel/CPAboutDrawer.cs | 2 +- VirtueSky/ControlPanel/CPAdjustDrawer.cs | 2 +- VirtueSky/ControlPanel/CPAdvertisingDrawer.cs | 2 +- VirtueSky/ControlPanel/CPAudioDrawer.cs | 2 +- VirtueSky/ControlPanel/CPFirebaseDrawer.cs | 1 - VirtueSky/ControlPanel/CPIapDrawer.cs | 2 +- VirtueSky/ControlPanel/CPSoEventDrawer.cs | 2 +- VirtueSky/ControlPanel/CPSoVariableDrawer.cs | 2 +- VirtueSky/ControlPanel/CPUtility.cs | 34 +++++ .../ControlPanel/ControlPanelWindowEditor.cs | 21 ++- VirtueSky/Utils/Editor/.DS_Store | Bin 6148 -> 8196 bytes VirtueSky/Utils/Editor/EditorResources.cs | 74 ++++++++- VirtueSky/Utils/Editor/Icons/icon_about.png | Bin 0 -> 4934 bytes .../Utils/Editor/Icons/icon_about.png.meta | 140 ++++++++++++++++++ VirtueSky/Utils/Editor/Icons/icon_adjust.png | Bin 0 -> 10921 bytes .../Utils/Editor/Icons/icon_adjust.png.meta | 140 ++++++++++++++++++ VirtueSky/Utils/Editor/Icons/icon_ads.png | Bin 0 -> 7533 bytes .../Utils/Editor/Icons/icon_ads.png.meta | 140 ++++++++++++++++++ .../Utils/Editor/Icons/icon_appsflyer.png | Bin 0 -> 24021 bytes .../Editor/Icons/icon_appsflyer.png.meta | 140 ++++++++++++++++++ VirtueSky/Utils/Editor/Icons/icon_audio.png | Bin 0 -> 22378 bytes .../Utils/Editor/Icons/icon_audio.png.meta | 140 ++++++++++++++++++ .../Utils/Editor/Icons/icon_extension.png | Bin 0 -> 27438 bytes .../Editor/Icons/icon_extension.png.meta | 140 ++++++++++++++++++ .../Utils/Editor/Icons/icon_firebase.png | Bin 0 -> 10597 bytes .../Utils/Editor/Icons/icon_firebase.png.meta | 140 ++++++++++++++++++ VirtueSky/Utils/Editor/Icons/icon_folder.png | Bin 0 -> 6638 bytes .../Utils/Editor/Icons/icon_folder.png.meta | 140 ++++++++++++++++++ .../Utils/Editor/Icons/icon_game_service.png | Bin 0 -> 61517 bytes .../Editor/Icons/icon_game_service.png.meta | 140 ++++++++++++++++++ .../Utils/Editor/Icons/icon_hierarchy.png | Bin 0 -> 6784 bytes .../Editor/Icons/icon_hierarchy.png.meta | 140 ++++++++++++++++++ VirtueSky/Utils/Editor/Icons/icon_iap.png | Bin 0 -> 21002 bytes .../Utils/Editor/Icons/icon_iap.png.meta | 140 ++++++++++++++++++ .../Utils/Editor/Icons/icon_in_app_review.png | Bin 0 -> 12978 bytes .../Editor/Icons/icon_in_app_review.png.meta | 140 ++++++++++++++++++ VirtueSky/Utils/Editor/Icons/icon_package.png | Bin 0 -> 8448 bytes .../Utils/Editor/Icons/icon_package.png.meta | 140 ++++++++++++++++++ VirtueSky/Utils/Editor/Icons/icon_unity.png | Bin 0 -> 4353 bytes .../Utils/Editor/Icons/icon_unity.png.meta | 140 ++++++++++++++++++ 41 files changed, 2085 insertions(+), 21 deletions(-) create mode 100644 VirtueSky/Utils/Editor/Icons/icon_about.png create mode 100644 VirtueSky/Utils/Editor/Icons/icon_about.png.meta create mode 100644 VirtueSky/Utils/Editor/Icons/icon_adjust.png create mode 100644 VirtueSky/Utils/Editor/Icons/icon_adjust.png.meta create mode 100644 VirtueSky/Utils/Editor/Icons/icon_ads.png create mode 100644 VirtueSky/Utils/Editor/Icons/icon_ads.png.meta create mode 100644 VirtueSky/Utils/Editor/Icons/icon_appsflyer.png create mode 100644 VirtueSky/Utils/Editor/Icons/icon_appsflyer.png.meta create mode 100644 VirtueSky/Utils/Editor/Icons/icon_audio.png create mode 100644 VirtueSky/Utils/Editor/Icons/icon_audio.png.meta create mode 100644 VirtueSky/Utils/Editor/Icons/icon_extension.png create mode 100644 VirtueSky/Utils/Editor/Icons/icon_extension.png.meta create mode 100644 VirtueSky/Utils/Editor/Icons/icon_firebase.png create mode 100644 VirtueSky/Utils/Editor/Icons/icon_firebase.png.meta create mode 100644 VirtueSky/Utils/Editor/Icons/icon_folder.png create mode 100644 VirtueSky/Utils/Editor/Icons/icon_folder.png.meta create mode 100644 VirtueSky/Utils/Editor/Icons/icon_game_service.png create mode 100644 VirtueSky/Utils/Editor/Icons/icon_game_service.png.meta create mode 100644 VirtueSky/Utils/Editor/Icons/icon_hierarchy.png create mode 100644 VirtueSky/Utils/Editor/Icons/icon_hierarchy.png.meta create mode 100644 VirtueSky/Utils/Editor/Icons/icon_iap.png create mode 100644 VirtueSky/Utils/Editor/Icons/icon_iap.png.meta create mode 100644 VirtueSky/Utils/Editor/Icons/icon_in_app_review.png create mode 100644 VirtueSky/Utils/Editor/Icons/icon_in_app_review.png.meta create mode 100644 VirtueSky/Utils/Editor/Icons/icon_package.png create mode 100644 VirtueSky/Utils/Editor/Icons/icon_package.png.meta create mode 100644 VirtueSky/Utils/Editor/Icons/icon_unity.png create mode 100644 VirtueSky/Utils/Editor/Icons/icon_unity.png.meta diff --git a/VirtueSky/Advertising/Editor/AdSettingEditor.cs b/VirtueSky/Advertising/Editor/AdSettingEditor.cs index 16ad71d2..e80348ac 100644 --- a/VirtueSky/Advertising/Editor/AdSettingEditor.cs +++ b/VirtueSky/Advertising/Editor/AdSettingEditor.cs @@ -84,7 +84,7 @@ void Draw() serializedObject.Update(); Initialize(); // EditorGUILayout.LabelField("ADS SETTING", EditorStyles.boldLabel); - GuiLine(2); + //GuiLine(2); GUILayout.Space(10); EditorGUILayout.PropertyField(_adCheckingInterval); EditorGUILayout.PropertyField(_adLoadingInterval); diff --git a/VirtueSky/ControlPanel/CPAboutDrawer.cs b/VirtueSky/ControlPanel/CPAboutDrawer.cs index 2170efe3..8bdd6f70 100644 --- a/VirtueSky/ControlPanel/CPAboutDrawer.cs +++ b/VirtueSky/ControlPanel/CPAboutDrawer.cs @@ -10,7 +10,7 @@ public static void OnDrawAbout(Rect position, Action drawSetting = null) { GUILayout.Space(10); GUILayout.BeginVertical(); - GUILayout.Label("ABOUT", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.About, "ABOUT"); GUILayout.Space(10); GUILayout.TextArea("Name: Sunflower", EditorStyles.boldLabel); GUILayout.TextArea( diff --git a/VirtueSky/ControlPanel/CPAdjustDrawer.cs b/VirtueSky/ControlPanel/CPAdjustDrawer.cs index 018c595f..bab04bab 100644 --- a/VirtueSky/ControlPanel/CPAdjustDrawer.cs +++ b/VirtueSky/ControlPanel/CPAdjustDrawer.cs @@ -27,7 +27,7 @@ public static void OnDrawAdjust() { GUILayout.Space(10); GUILayout.BeginVertical(); - GUILayout.Label("ADJUST", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.Adjust, "ADJUST"); GUILayout.Space(10); CPUtility.DrawButtonInstallPackage("Install Adjust", "Remove Adjust", ConstantPackage.PackageNameAdjust, ConstantPackage.MaxVersionAdjust); diff --git a/VirtueSky/ControlPanel/CPAdvertisingDrawer.cs b/VirtueSky/ControlPanel/CPAdvertisingDrawer.cs index 5e517429..48032950 100644 --- a/VirtueSky/ControlPanel/CPAdvertisingDrawer.cs +++ b/VirtueSky/ControlPanel/CPAdvertisingDrawer.cs @@ -33,7 +33,7 @@ public static void OnDrawAdvertising(Rect position) { GUILayout.Space(10); GUILayout.BeginVertical(); - GUILayout.Label("ADVERTISING", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.Advertising, "ADVERTISING"); GUILayout.Space(10); scroll = EditorGUILayout.BeginScrollView(scroll); if (_adSetting == null) diff --git a/VirtueSky/ControlPanel/CPAudioDrawer.cs b/VirtueSky/ControlPanel/CPAudioDrawer.cs index 8e8921a5..bf2fcde1 100644 --- a/VirtueSky/ControlPanel/CPAudioDrawer.cs +++ b/VirtueSky/ControlPanel/CPAudioDrawer.cs @@ -10,7 +10,7 @@ public static void OnDrawAudio(Rect position) { GUILayout.Space(10); GUILayout.BeginVertical(); - GUILayout.Label("AUDIO", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.Audio, "AUDIO"); GUILayout.Space(10); if (GUILayout.Button("Create Sound Data")) { diff --git a/VirtueSky/ControlPanel/CPFirebaseDrawer.cs b/VirtueSky/ControlPanel/CPFirebaseDrawer.cs index 58411d9f..c74969a1 100644 --- a/VirtueSky/ControlPanel/CPFirebaseDrawer.cs +++ b/VirtueSky/ControlPanel/CPFirebaseDrawer.cs @@ -48,7 +48,6 @@ public static void OnDrawFirebase(Rect position) static void DrawRemoteConfig(Rect position) { - GUILayout.Space(10); GUILayout.Label("FIREBASE REMOTE CONFIG", EditorStyles.boldLabel); GUILayout.Space(10); isShowInstallRemoteConfig = diff --git a/VirtueSky/ControlPanel/CPIapDrawer.cs b/VirtueSky/ControlPanel/CPIapDrawer.cs index f5ec47ae..805e66ca 100644 --- a/VirtueSky/ControlPanel/CPIapDrawer.cs +++ b/VirtueSky/ControlPanel/CPIapDrawer.cs @@ -38,7 +38,7 @@ public static void OnDrawIap(Rect position) { GUILayout.Space(10); GUILayout.BeginVertical(); - GUILayout.Label("IN APP PURCHASE", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.InAppPurchase, "IN APP PURCHASE"); GUILayout.Space(10); scroll = EditorGUILayout.BeginScrollView(scroll); #if VIRTUESKY_IAP diff --git a/VirtueSky/ControlPanel/CPSoEventDrawer.cs b/VirtueSky/ControlPanel/CPSoEventDrawer.cs index 3f65840b..6cf7379b 100644 --- a/VirtueSky/ControlPanel/CPSoEventDrawer.cs +++ b/VirtueSky/ControlPanel/CPSoEventDrawer.cs @@ -15,7 +15,7 @@ public static void OnDrawSoEvent() { GUILayout.Space(10); GUILayout.BeginVertical(); - GUILayout.Label("SCRIPTABLE OBJECT EVENT", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.SO_Event, "SCRIPTABLE EVENT"); GUILayout.Space(10); scroll = GUILayout.BeginScrollView(scroll); CPUtility.DrawToggle(ref isShowFielEvent, "Scriptable Event", () => DrawButtonEvent()); diff --git a/VirtueSky/ControlPanel/CPSoVariableDrawer.cs b/VirtueSky/ControlPanel/CPSoVariableDrawer.cs index 9ad392d1..57c0b271 100644 --- a/VirtueSky/ControlPanel/CPSoVariableDrawer.cs +++ b/VirtueSky/ControlPanel/CPSoVariableDrawer.cs @@ -10,7 +10,7 @@ public static void OnDrawSoVariable() { GUILayout.Space(10); GUILayout.BeginVertical(); - GUILayout.Label("SCRIPTABLE OBJECT VARIABLE", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.SO_Variable, "SCRIPTABLE VARIABLE"); GUILayout.Space(10); if (GUILayout.Button("Create Boolean Variable")) { diff --git a/VirtueSky/ControlPanel/CPUtility.cs b/VirtueSky/ControlPanel/CPUtility.cs index dabaf5a8..e6fba00e 100644 --- a/VirtueSky/ControlPanel/CPUtility.cs +++ b/VirtueSky/ControlPanel/CPUtility.cs @@ -108,5 +108,39 @@ public static void DrawToggle(ref bool value, string text, System.Action draw) draw?.Invoke(); } } + + public static Texture2D GetIcon(StatePanelControl statePanelControl) + { + return statePanelControl switch + { + StatePanelControl.Advertising => EditorResources.IconAds, + StatePanelControl.InAppPurchase => EditorResources.IconIap, + StatePanelControl.Audio => EditorResources.IconAudio, + StatePanelControl.InAppReview => EditorResources.IconInAppReview, + StatePanelControl.NotificationsChanel => EditorResources.IconPushNotification, + StatePanelControl.SO_Event => EditorResources.IconScriptableEvent, + StatePanelControl.SO_Variable => EditorResources.IconScriptableVariable, + StatePanelControl.Adjust => EditorResources.IconAdjust, + StatePanelControl.AppsFlyer => EditorResources.IconAppsFlyer, + StatePanelControl.GameService => EditorResources.IconGameService, + StatePanelControl.Firebase => EditorResources.IconFirebase, + StatePanelControl.Hierarchy => EditorResources.IconHierarchy, + StatePanelControl.Extensions => EditorResources.IconExtension, + StatePanelControl.FolderIcon => EditorResources.IconFolder, + StatePanelControl.RegisterPackage => EditorResources.IconPackage, + StatePanelControl.About => EditorResources.IconAbout, + _ => EditorResources.IconUnity + }; + } + + public static void DrawHeaderIcon(StatePanelControl statePanelControl, string textHeader) + { + GUILayout.BeginHorizontal(); + GUILayout.Box(CPUtility.GetIcon(statePanelControl), GUIStyle.none, + GUILayout.Width(32), GUILayout.Height(32)); + GUILayout.Space(3); + GUILayout.Label(textHeader, EditorStyles.boldLabel, GUILayout.ExpandHeight(false)); + GUILayout.EndHorizontal(); + } } } \ No newline at end of file diff --git a/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs b/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs index 642a0ded..ef425209 100644 --- a/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs +++ b/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs @@ -2,6 +2,7 @@ using UnityEditor; using UnityEngine; using VirtueSky.Inspector; +using VirtueSky.UtilsEditor; namespace VirtueSky.ControlPanel.Editor @@ -44,12 +45,13 @@ private void OnDisable() private void OnGUI() { - // EditorGUI.DrawRect(new Rect(0, 0, position.width, position.height), - // CustomColor.Aqua.ToColor()); GUILayout.Space(10); - // GUI.contentColor = CustomColor.Aquamarine.ToColor(); + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); GUILayout.Label("SUNFLOWER CONTROL PANEL", EditorStyles.boldLabel); - // GUI.backgroundColor = CustomColor.Gold.ToColor(); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + Handles.color = Color.black; Handles.DrawAAPolyLine(4, new Vector3(0, 30), new Vector3(position.width, 30)); // GuiLine(2, Color.black); @@ -59,7 +61,7 @@ private void OnGUI() scrollButton = EditorGUILayout.BeginScrollView(scrollButton); DrawButton(); EditorGUILayout.EndScrollView(); - Handles.DrawAAPolyLine(4, new Vector3(ConstantControlPanel.POSITION_X_START_CONTENT, 0), + Handles.DrawAAPolyLine(4, new Vector3(ConstantControlPanel.POSITION_X_START_CONTENT, 30), new Vector3(ConstantControlPanel.POSITION_X_START_CONTENT, position.height)); GUILayout.EndVertical(); @@ -157,12 +159,19 @@ void DrawContent() void DrawButtonChooseState(string title, StatePanelControl _statePanelControlTab) { + GUILayout.BeginHorizontal(); + GUILayout.Space(5); + GUILayout.Box(CPUtility.GetIcon(_statePanelControlTab), GUIStyle.none, GUILayout.ExpandWidth(true), + GUILayout.Width(18), GUILayout.Height(18)); bool clicked = GUILayout.Toggle(_statePanelControlTab == statePanelControl, title, GUI.skin.button, - GUILayout.ExpandWidth(true)); + GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true), GUILayout.Height(20)); if (clicked && statePanelControl != _statePanelControlTab) { statePanelControl = _statePanelControlTab; } + + GUILayout.EndHorizontal(); + GUILayout.Space(2); } } diff --git a/VirtueSky/Utils/Editor/.DS_Store b/VirtueSky/Utils/Editor/.DS_Store index 47f8d54c42464ef9f752d341aef21293d8deea11..293dacc929239b1bc068b27b486c9d4b36ced2da 100644 GIT binary patch literal 8196 zcmeHMU2GIp6h7ayg&8}vQ!KO$&|Rp2Vgn_BDTbfzAJS56LtFX-5x2WTJ2IWAJG0w@ zFD1tKZ;Vl2k*F^|5Pwh~4E{YB6Jr$9m`KzZ|DSx~1rv?u&YdM}fj45BFgLmP+jH(c zXYQQ&&fK0U5uq)g-9l7PL@IZIMkNo|X<}aVYnl>i${E4-M84w}+Q%Gk?3%T)B91^D zfj9zj1mXz95m*=z;4@n^^#|GEn`DHk2xldRrtDKz4~R?=l^BrbJf9TH8B-C?N|fdVX-l ziSZamAdbMb5fJH9L0yy~kKC*4_p8KWhccd%pLG4BMolK|Wb#fruv#5QEM{G`pUHWS)93ki zV0-S!aA3^@MMou5!=t{J3)(|xM-3zITL&%nWf!at_Q8rs^YR0?jkt}cKfR`1P*>J{e zFz-;+!$RMlvv`zheS>+IW~9{tp93LXH0hf(!`B9m+iqmKMc=9#S#8isk6DiNc8}ho z8vC`Og1keitkrj_+Hl63oa9aWQn$x!RgKTp2gHSY(tgl8Wx2&I?J+x5b=03o=d9jo z*UA+wx>PlMfUFlLomo5Za^YR?Z!paf;i@&8wX)Gon|O4BIW(0Y4390Ylzb z8&m%CVeA`I8|5=-lt2{5QmZYB5sFv-YFbY%{E8o-V@$wP^bDP*b9A0Qq%Y}P`jLL6 zzvwdkP5;opD1(k=s6#zgU@aQ44(qWMJFyG9(T#o#;1Gsz1Qw2A0ybPsV+JSj2u|TC zJdJ1Z9A3t0yn-`$1MlD*-oyL&3}4}ET)_AE4Zq_LTvilCSC%MMN}W=#n953Jld@T9 zQCgL5rB~^bdsm`Uh(=5ANlCL@nod*lbC`1W`stLoZ(mop-m~D->ANbCK)2T}TV9tG zS=F+u^$PtYTZ;s}n)o5tOEM(nddP?QJmoZ7xoWkZ802KIX6C17F>Q^-B01GLv3ku~ zJz-REx=3;T1{N1_sz~wfrbNO}I76k_yd|LrjwkRWUcifZDdhJVyo%TGI?m!vyoI;%0nXzie2h=s delta 131 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{MGqg=C6q~50D9Q+A12Isnk|BU0ks+BOn;~&x zq55VUvD1tj8#b~oX6N7#WCm#gs^SI`u0Y(jvG6 FileExtension.FindAssetWithPath("box_content_dark.psd", RELATIVE_PATH); - public static Texture2D BoxBackgroundDark => FileExtension.FindAssetWithPath("box_bg_dark.psd", RELATIVE_PATH); - public static Texture2D EvenBackground => FileExtension.FindAssetWithPath("even_bg.png", RELATIVE_PATH); - public static Texture2D EvenBackgroundBlue => FileExtension.FindAssetWithPath("even_bg_select.png", RELATIVE_PATH); - public static Texture2D EvenBackgroundDark => FileExtension.FindAssetWithPath("even_bg_dark.png", RELATIVE_PATH); - public static Texture2D ScriptableFactory => FileExtension.FindAssetWithPath("scriptable_factory.png", RELATIVE_PATH); + + public static Texture2D BoxContentDark => + FileExtension.FindAssetWithPath("box_content_dark.psd", RELATIVE_PATH); + + public static Texture2D BoxBackgroundDark => + FileExtension.FindAssetWithPath("box_bg_dark.psd", RELATIVE_PATH); + + public static Texture2D EvenBackground => + FileExtension.FindAssetWithPath("even_bg.png", RELATIVE_PATH); + + public static Texture2D EvenBackgroundBlue => + FileExtension.FindAssetWithPath("even_bg_select.png", RELATIVE_PATH); + + public static Texture2D EvenBackgroundDark => + FileExtension.FindAssetWithPath("even_bg_dark.png", RELATIVE_PATH); + + public static Texture2D ScriptableFactory => + FileExtension.FindAssetWithPath("scriptable_factory.png", RELATIVE_PATH); + + public static Texture2D IconAds => FileExtension.FindAssetWithPath("icon_ads.png", RELATIVE_PATH); + public static Texture2D IconIap => FileExtension.FindAssetWithPath("icon_iap.png", RELATIVE_PATH); + + public static Texture2D IconScriptableEvent => + FileExtension.FindAssetWithPath("scriptable_event.png", RELATIVE_PATH); + + public static Texture2D IconScriptableVariable => + FileExtension.FindAssetWithPath("scriptable_variable.png", RELATIVE_PATH); + + public static Texture2D IconAudio => + FileExtension.FindAssetWithPath("icon_audio.png", RELATIVE_PATH); + + public static Texture2D IconFirebase => + FileExtension.FindAssetWithPath("icon_firebase.png", RELATIVE_PATH); + + public static Texture2D IconAdjust => + FileExtension.FindAssetWithPath("icon_adjust.png", RELATIVE_PATH); + + public static Texture2D IconAppsFlyer => + FileExtension.FindAssetWithPath("icon_appsflyer.png", RELATIVE_PATH); + + + public static Texture2D IconInAppReview => + FileExtension.FindAssetWithPath("icon_in_app_review.png", RELATIVE_PATH); + + + public static Texture2D IconGameService => + FileExtension.FindAssetWithPath("icon_game_service.png", RELATIVE_PATH); + + public static Texture2D IconFolder => + FileExtension.FindAssetWithPath("icon_folder.png", RELATIVE_PATH); + + public static Texture2D IconHierarchy => + FileExtension.FindAssetWithPath("icon_hierarchy.png", RELATIVE_PATH); + + public static Texture2D IconPushNotification => + FileExtension.FindAssetWithPath("script_noti.png", RELATIVE_PATH); + + public static Texture2D IconUnity => + FileExtension.FindAssetWithPath("icon_unity.png", RELATIVE_PATH); + + public static Texture2D IconExtension => + FileExtension.FindAssetWithPath("icon_extension.png", RELATIVE_PATH); + + public static Texture2D IconPackage => + FileExtension.FindAssetWithPath("icon_package.png", RELATIVE_PATH); + + public static Texture2D IconAbout => + FileExtension.FindAssetWithPath("icon_about.png", RELATIVE_PATH); } } \ No newline at end of file diff --git a/VirtueSky/Utils/Editor/Icons/icon_about.png b/VirtueSky/Utils/Editor/Icons/icon_about.png new file mode 100644 index 0000000000000000000000000000000000000000..6aa7c357cdf728bbf0f58a1ba2ac27b281b7e5f3 GIT binary patch literal 4934 zcmZ{o2T&8;x4<_Ep@f#uL6BagCLj=cks=a0NGFg`rB^|Up-D9;U8IT%B2pCT!U_sj zKdw%1eHqxfc<0sD*!~I0pOcE0H_xO z0Cz}frct8qdSWZwk=^{+b4C$5`nVF;^ zHjaVW0Dx>TG0?M(o>?o44RINdAJpmXlJT?8^?KPF@NzFz5KEasy7RN0%uP(mrCEi_ zVU&0;ycWxsI3p35c3QaXl$p=_+kwR_UT2#?8sD=d<(&MHYhY%}i1h&Sz>~qJlUPp8G2Qi5w-hae*8o1+QE&E!qq2}u|t32hc^y~PKf;HA}c)Gpvk|fJgG@a zUz%#ZP! zW>(ar`gUnEkl!5@!q%jI5Ke13h^ih0{ByfyD1eG_Ruy+NT{KHH=M+3b^t~vSSf}5) zqu7f#e3xPlEC=DP>)qqJ$L;`>GPwYyuol9(OFuc{|L}w$zYfqZ6@fBfkZJuHgy!Rz zvW3PM>{Uqcx4DDuK>JFJ4p@;BtH7sTK`F ziCka_`9WoR<`6_1QcpKS^3IlFWn&2eM3cG_eXQnlD7Q5fb~OUk7;XbI8rJSi-Sq7| zU%~c$zTVL~0h!FXL%qE;7!_)7aQ1bvMWkjz-vu;(YmE?=8qs7BR5(dvqP0?Gk#+_`3 zIG9A6#tHLNjz}Aj9P9`;UHOl9qI(jgD0YftdP5&ig52E)37TlACQF>LAs)%OP?ws? zDC9hxymH-{buQg+STLuXF^;?4*mZ0|4H4xO;Y0c!%MED7{$pbkMjRD`@Ky=hIfu%R8$yiB$vQS6*peWxJSPqP)fBg{R_jGKx$n5zpM>6!A6#X+u`66bzJiay21^e;SCrJeQlqpS8 zuk+Qkfo#@s4yF^lW`AGK@;mrVhGy_({j9h#`06<`wyvSv??Ua}dsQXeZM)Z-m3e~R z(7dZ5NYrb$ef=Txm|sLnO%ea-RBCl)Un*!uQ(M+Ze%N%Uu)vhhl6#^Vf&xih>bZ4kXb)6$|mw&t92mATyB)anL`3=CS7 zkU6iZyF=fC7vWm)6y?iKCG_XmNM+3sJ~T|@{$YZWpg0%1laIL6T@Oj!(UuE@^AsAO z2|C&_QQ7?dy?qNXqi*df%Sn;O8Cy`0mD1jv^IXj-q!yyYX99)K@PTz*(k+@M?_}Q5 z9E~u(%}JW*vy)cO^NuP=C;y6G8w2p{pK!<-6)s6CR(aRb4Ax^pk_?|BzYh;#l6#+- z+~0b?FgfQ9tcMwwCqm>LhWgGHi#W?AoZKs22o@3~S9d=NCgBFUP{v9ujT_$vqo8sC zi7`=zh`HH%)mckt)e#V(NbO*D_Mlp676#Ei3qr9U1h+ZfIu|x=Bzw3`hc?v$5BtPO z-vc#Tb)R)PXfX)Q&Psv>#nWAhMl_dLu5OKt&i`P}?qEw4@2g5=(m87U^Mjv{@tlRb zusNh>l{6mZIdn&+dl0z$_Oh$h@IHyYyZfWiu4Yf#I;@}mZi=&rgZ?izSyN=Uk9Zi(rif7WhVr#svt@5teD@X>A-g=$I{u*+jNWN+e)T}2Y6 zz&Z)a?AAKa8?yz>(_Q&vexZ3TTl{k3(rwkQ6DmmBBETDo#a^pw zTyUYIQ_Rj*H=bv==7Qks8`vh=v*B~&9}$FinWz3#)gCYkhy94m76LopVFE*EPfGc| z*~w{_SWECFq%9cn$9#O?wM`N5;$x$Ckj-ZXNe+AxpS{Kk3ooP@?^qmAC3Rx>3#Xhvx_}J2e@0qr^qop(lZK3CA5$ zi$rO+*7n@)JmRT_SIJK@k@caz+ZsRJEK~Pqu=g#35KFo8y}o_8#ftnmsPD7V78IXt z!Nd*amN)fkT;DdrtSriPwJU(Ts7=3x-XdO8hvsO$#~BW`2ZF*Gr{3h{S^&&@7unK$ zY^$o|hj?F~=tmdz=GtEO5o@z#LYBC8*%fp=$~~<*P7|+YeT5V!OCyDFwsV{aIE z^zvngk4+DG-7-IcR41LKWDz9hnAf#qjJcnhV-xl(^Ao%7z=my?9_NKRS);-HW&HQD zmftlOejPfhG?E=Moa<8Z7hT>DOOi0Srwl(%uqRe|+^o=SR$bO2OJ_Ox|K8ufGd7s> zT7K!Ni{K}A5b3=$464F8w}U=Wu-*!kkNI0LIZ1JRO9O&m-Y=F?6e;y2`S^(O zt-K1gj;VrF%ok7S8emu8ZZ9sL5r(XaT1e^}P^K*)2b@S!+*uB~lpCtz7J|Sh6v+wU zOB-GsIws1a9YC2x5Y5ZO%6IY_W?AW&8*_co!Xiy^Kmw6*)>_LJ@jmFk8D>Ue-0ZnitdIh$aP|zp3}^$o607YZ<`>uN!Rl@MKJH<$;a@~O5o(I7 zg_byKuP>_UIjHoK_h&$PsWsZaEMH~L*ObFU#(!Fnk2;aulGb}yt6yb=f8YD@&0997 zBhvObS%2jWBbL115y1!0Bj(Ld-ocSa*m8JNV{eg`1}(%~lp>R6SEbFn{65^tw_YJ= z_nHF^d-TSe>+uBbTgF4ScEhLP6xHju>PWv$FMP+)nZWr_Sbsxy87>Q%ndmz7qpHlu z%dOYyo0CM6R7t_mCuG+We`yt3-@fNDrxTVucbPl)^1{=L+GWzKn+Tz>3MVyDdb_7- zU>m=woBra8+y_{128Rqutylu+c#r!IwBm=~&s?Qah}#{fJ0>t?%z#{!3Z&v^w05*6 zQ(Zg}aW!$OetSRQj%6x)346U(W2!;q@9(RlMXKAc$jOJxrkt+W2Vg(ghN2xcG&;;% ze47p>*cg*obJ-HvOY&CZFBembGK-f-3+gg@W(Ch*I6S{{<}a-M16QsgG+A8I zUYJK#-hVTYwv+_^rqKj6X`2!`LYSLu0>5@Xiu?K3z=g5$iKueV;@5Nf5oBF@UWj_4 zf8xbv+0J#@%P$27ojEI=Oi3`1NIFTO19f1qI}ux*&;6N3=t~{8Cd1-3B|@riozl}Z z`z{S{gchHn{>mT~X*D5nXHNfBB;>7^suvwubtBxhg>S%+Y`(^2B%{(h|YDy2*1n$jOswN%s>?u*Kac$uaT1m;6!)owB zW)BPD;Pbj(z@O&!(0nSULczno(m5 zqeq+5nUW6!KfSfw>+c7?-J zN8pbB+4e|f$(zHl8IlF@8JfFzXzZ$8w#Tmz3ppztrbMP*M$>&OW&`)-)DZ@E5$=HY zimc9xE%$LMkq~zC8N8dM0EOv>_uu+eG%D0PMBM@gLANfukk#@oQ=j<ps?CIwn^Zy&PIhhtw4TO%L5FYFuanU2p3-FDI z2nknLQ1A=%@bRJ!Kcc^UaF|c`us|7=goo;#K=Iepa^w!ODY-;U}}!K z6#k1bIrgHie%8y+$2S5{#wg}owMnEh-2d|Pzl^<~XN2!D!XF2lqawWjLd^UEy&_^l zynugBr4SP2qx0~*`G5H_v!zl1Mnz2xtE#4?h*=$*6Q&~U|MFwwcZo`zR#V03>kD4x zf>PD-|5Dpon*iQ^0bbPbLHFM0ocqpM`>y-mS}$u&GV}dkuYYDH0cE7aK+8i5000>DbT62Y zeu*as4HfCTO9eeh`T^l}tpfl6I@Xhe43M461pv?r;moWER)z*hjIXyO+QruyD;eUA zCt(8sN~$4vG{zH406Syda6ZbAuTR?`V4RCG#8TD}W{B6sy5n@i{IRBCMrN2WPmF>K zL{$Z>6oMo%@Wv9*;1F*wp8#ZtGUOLuB|xg{w}UalMC8^$Rb@S zL)-}jJQ4~G4i1(KmXY-JcY{hPC@4T-(okt>2@-}xK&TG^9U|cqAowST3)ldRKMqg8 z`TBrQIHH|>0}09ylBT~+@WvY&{>9iQ;15TUTm}t6rW}$d2)C3#g8|aV0Y6W3^2!j70H^KhHivIyQ3H>i(7tCLR@qzwczpQt`K(Ss} zZ<34vlB!aF>4|suCHMxo`{Ms1`4?e-E&sCbPwhyt{rBj9I^s`60?ze6SaGuQFFdg! zxc`89vho)yDF(<3zL>xhOY|=MnN=>n7@Q08FJ+N3Sh&1A0t1(TOS{TSpkZ*B1X{)g zE#cw}mq9yA$zl<*uoE3mxas)>5YRpt>VA;96Rm8qx?U zn7o3t6a?&oLAv_-d!tD?g7ZeZVWD^*HwgG27HIl<`T86Bx?q(dGXD(M)6_)y`?})1 zNDBcbIvQX-EloKo1vxnhX-N`Wk^x9fe=M4Sy+AsYA*8~AOTc6$U{YpMQb@S87)%}s z`)xXs#2x1v`hVidAW1bQCHF6=q>^<(6VQK)d=gfq-ibk$I2VGuGDP7-+CQKMSRc24 z1*1+9kkk_VaTq-x0@fezPm*;~gCynupfp8$LfM0Oy{{a67*xUz4@;phvNpc~zNM9CM|A1doVbU@rKEL3F$*(2r|F(3}5P#*GE-rxJ>mT|@%QD6K{c+}n1OI9mNHpfR zF#+fxtPA81AnxB}sEe#CTo!?lmXL8F#oiSGmnCJW97aM8Bds7MC+DKz;v)AaeXu+B z#GC(`3MWziGsM4T2l%=Yg3I?I3E|^-~iD-d1Kts zK5kgjIDkT+|H&APuTK!xpYRWZ@MwQDDdZ%ND??oUeZ9fIOTYtzSFGqOc{wl4%1O2n({;iB( z2>-OzA#wf%BJH0}PXF4tkuLt)`eA)Y1@2GU*b$9s?*jl}F}(}wW+Ay>@H56HXpHz$mO!|`o%?8kHjGJDEZzjkVRG6s>{+!*S8bR)TM zS)_v8Vex4rqb@V@h}R4kE70Yj&vi9Iptt$WM*1QCT&_Y+`Jmw4j$2Fu9z;vJjd=9l z5bsNK;yVTz?|YhtwvjGRb+*cFK0UA%U)|Kz8?{S76VFokm-o+419JqpiXRx=gDI;= zwDz>i20nf_8TrPFIFW*PpgnrVYU90!S8g#Q`cO+gjO?qsMb&&IGlzIK?u>*}BFL29 zDm!ZSDO!u+B~SQ0a>=Sl_WGKxNJdWDR-Okjj1%5g?&@~YKSRyOR5+6W>9h$Dn|f_z znUvr|sV|(*UVPeAI7(OAeyWsB6<$u4^3DE=*^g03^v0_sK`}K}M0TMLCp{TA)L3L? z9H%Q69O`B0?q%%$*xYk%tgy}CreYPs0|bstqpC+r;F3*)6(1jk5wUM2lfrd-Z5>HCo7sf zY@%`yvRDcs0$6ygqFkaoLT@tq%?%JIV(uzOwT-e%y+Do;nRl6NqnF6fj+p4XPavtiaaa4=lK>LxAFUCo3j zn)yhwuVjR&?(WRWV@qCF)+!%+@_@E}m6u8vvIL|)J)pX_(Q9If)CJf)?YsV#QD!v6 zHe+}?j}bbZt<>`TLq{ah{{FSL;0zviLx7>0O?;Hgrda6Q(F>T^J~_v3$mHGVvWf)G zg>#(LmmyU4H}bfD|!$oSuD$1iC@IV8XiW1H6d0!6u=hZ zdy9e+MLUjfgzahe`ZpHU+W{roX#(u(CoWjpOSbk2k?c}z7J7K+K0GKHC04zW@J>Jr z!j+x@GEAk!KEl5g%xm(kJXoRL7~QIC&;eU1K1 zqqjBg=4*0#TzghoF}s2#jJu3jjf^ejr$ zUh?>{WYOKcg%|e#-YBJWO5>}*!s z7Un#(N_dXNsPlR9NAV+gNqjkJp7GTG^Q|>sgY}NnakRrcTb^)T|kd zY&7c<$*4Q3i_Zz#7dOmIzuW-j$w^!ZdUzdj9@pt}Q>$%lp<=>opCKt7$UZnP(>gA5 zhhoF!u?79~bLtnzTJp!WQ_EgYHO@K$8~~I|yi9hEKVKZI)ql+(*CTIe5^ef)aC z|F9yIi!p7`7PH2|4lxSb6QC9(*hN2(u8}hC>g9bG;g!i`b-y;o{Pp{bW`}tk?ct|g zZ3a*i%N_TD-+nk{4Is=vwbGfP^i`PLEH}5m6WiK~5{}qqQP)PZddl42v3k-WCU^BG z)wqEk@DwJ7tt@+mIn1jf<(6?*0ofn2?bJC78)rUi+#H;(m7MY5xKm|*U$E~sit=z9zPFZk z<+$29UcnHr&vJyOR?4BA<@M9bpfx$)kF#2Rx)tvHbTFG8*|sjA!_hrX=8+uTD8kA+ zzo2f^(pE6?oywq2qbs6h=qi{@V9xq@zh59(W_)8AH(D%)yL5y4_JDKg4xP>V`a*#v zHfwe{QX=g!(kdy@isBRoei5}}7xy`T2!F%cZ2!FX_e&L5%gG9S_z&thXWDH&)py&W z6Lq@na!wV4I7iPV8GHUR7cTP98V>eHG^1bmn*yJ}*1A3@aaN6NIJ`CM;7dpRAamN= z_>Qzn;Xl}pBQnWr)Pa0Zt)`K;3O{dnL=HBxHMJO7UYTGTzYDp;IJ(5Y_s)=^fip8m zN4|iYtWm1?6 zgNMlWSqJZKv_=RZd0z$)PfVGAe#Q0-Jk1LVTWO6@ku(s#a~`!7jiSmg6A72@oNH4Z zE{j^OA8~V3c{Y@tJ$%>4`vjSU{^UldSHkJ=<$SI~VU3SgNBUxdT@mo~r?jiQ%nsbX|tEf}$ zZaGC3(60$`rT{G@eF?OIq&Gm!?9huZT<_Bp^qm8zEE{a%Rn*FnLc{BW zzQMk$CbV-i*O25Hdh{_O&b)e4`{KT@*PYtZ;xoEP5fj?|Nlu!n&h2imk`(5y7g?Dl z=o|w|ezZN6YDNpuQfxeN-TSJt`YkQ1f!D(L41mGmMZkw8Zplo~O}vV$sA6 zQ+C4CM?dZAi*?pTRSuChKLc3t_7i*1$tBi}+uElbbRYY*UKP?!kAAs6*4(%JLf*V% zyx8LsGxQwXV3+{>B>w@Ck(vL%q?75msS0%8cC3nfE8S7>e39zQVp=T)Ni3Rp!Cd1u zxZwk0sf>Q8qOJyc`X~P*nvDsSJw1WNb(IfopYU?`5@pO-CstAYf462ISK*;AJf zkKp{aKi0ZJaav`ZJ|@4@zmoC{8N)QY)uF}>VbLqVbW$UaVUjI0l*+7|EqY=ya>Ne~ zFL^klrBt*Qv~c9Ghox3ZO$bT`R8_`@mTl>gp$429jXyJHgeD{?QPS_h*ly7Z4ck*^C9YKtK6@Bc#>M$9R1lJCO)6>^VZGMsr+2jS)c@y#ww=p{9ORK zGs}GBnZ2P?hR_uS>Veb9E3hWARkAmu^oGnMh%b_d#nfTsr#KGp3-BkL0@!w6=5a#n zdn?|h$C%{C&uocbcFvqOjOCi?{c*Pp38($kfP66~GQV199CQ0+wNyilMAcE9=lo*x z>g8jM=7xJ)xt#0i^Us%8p6QETkBV)eX6oC^5=HAv2 zzbF;ZUedwypt5r;l_w^YvdT;>l(7B2)#oKdO8fZjrn%hsj>IT0X6N`ZwSVh*m69T= z?N+i7mvj3vc5i9U3U!D@Cs-9e|Eg=VuXO)Qc4-K4Na6Yrr4g?^Y7>7cSIxLw=z2>v z5Ngi^G|sE8hb;=>r`iQWf-?J{g-Bzo+#S9dMNcm0%{Epe5U2dt$r)RyH_8h{<- z3s_OVNl!rqeYz7QX6yZvNRxr@A)_BU3M*3Nn_Di)Gqh8wOjAfO7nFC!&OT*ZNJ+R2 zYq-nS)F!~sZ+7|6DrTIrrHyQTH8LZ>$-1PTk>j9IZba|C5#1>Na)juy<8A2SHN+pFfswG z=0-MjdvZ{%UZ#^p81?re?C?>sHgelcB-QC9lU}JE8*ZVhVfPHHll^*D}rD zEqCsAZtZ?2i?Wg>>qOBmVl>akJ5_>YiDIAU@4#EqD7z#dvYp~_2{+-Rgj`l}{s_pJ zDGa2Z>{b4>mKUxw_49aLe9ywOrC*hcg(vq;oUw5vUHM%p8z2)?`$U(=*9>Z8+eH{d ziPhYkjK@=Mat5mKh{WdBN%VV`=NHR|^_UgbggMA0%SuF-E}hnS3@TdN@*x|(*yUX} zU%rochdg?j8=vzOVEF9uf?ARpiv`EbLIPO`0hZlo%8A#L$aQ3Jh)kJsVm^mk(wMR~ zzrc7odFq+B!X(oK(_1a1nBo@CL|?ln&3*NE-&UQfEww zEtj%5d2UpN?cG$^=&~NLwPIkay%nJDaUk7tj*^ze=W~=jb4fd!X%Ahd4al(jlVX&b zcELrjMljFqwRfi`g?c+}OL0>(HIkpQc0rRgpgv++9pT`wB^eC{h(9`Af z6Z@#|egpzTOeO5B=ptoI6r0#+oL_i~12ch8k33EgMJw_%6d8qDOVGYYmN6{~Q9@Yi zQP`Fb@G4v_4!TtmUEOh&pzd}-6!tb|S6)4x`+kNooV+u1jDmSYTb7UbcBZmtqwAw4O0?&YTzC$riz$X}JpUXJorLox@T2 zq7-8F)thTp5=>k+-{|$&^H$vp(_^I68VnI4&1l-%Ywr4nkEn+@%ydp2--r<)bk6LS z$_M=@?WiSa#Za+wSbw?_^5DUIH%0MTFn7@$Dy#jX=|&O#VVe<_arok>;g0mR9K{81 z*-v#CbT;J-ypvV)e5{Jpm^vINPj)-H)0x>nzsCo@-$HX>JqC15bQc+$;%@Sj_XI3ai02_9p*8wd<_e(RnA?-iO>CJKU7s571BONQfv+la@y(qKPc zbT1FeckR4IMK_Mu?>=v(1B|p;{#qG-`9o)3-8=&ht8n<*XEmW|!bpB0o2pc<5T-t@ z&K>kJ=EZ=)xAE;qH2AOJh|~@>7jBN`u(vb?zV%apAMv^kc)m>Ujy~H-PpgZRe9OiA zYJzW+seSSv0#$uHk}N9q3UeJeX8` z8@I10_)?1KLn$Re_4jWIttc{mO)_ycti9j;lM_ubIx!g2*Ia^^9+B6H z2L@FqxSPIAix2jSSw1~~ke7IU>5_vXxsh=fgK42~FKFeVEM7|jW)#EAkRUy3DDSTN z>aP5!K)<@^x(6awtT;NFrK!fI8kx@X%U20frE@uLDCanK>gQ|HFnFR?^Qe6|t-sys zAXA8K3CPbyv=odx57lj-u}L?&HBw=9nPJ)4p5N~)6UuFe-T?g!OG6j+7tPf|H^}xl}s%(5QFl2vlZ4M z9_Nrt@2n^rhb=hNpbr))t9`CZN?W?kGm#HGs&fn;y~NU?-)Y2oG~?6cPaclBsZTGO zMx^017t`=G=~22tP3;0Wo9#8bR(s&6c-N71KPqFYeYWCbmTw);WR4WmD^cwW-`^Uf0|k(mVovU{SY?3lU5&Wzwr*_?SrK7GGD-OI@$ zX@NE7mS>|%=cb}NsBevW)P1kz`EKWM`X1D;)g43DfN+WJt;^=RG|WhOM!jw!7TqL& zcc=2&^3=vt*7;tp1V&@m`7yFvNK8;wlWZ}IlaP~rsbI_1q%BIXo6L>^oGTB|T5omr zUoH4MO&)!1%&g4vl|r2D?HA%8a~SOM42>!xdYgJT-xE@&h%sqL3 zZn3O?GP&J#hvNz=TJ6UdRuH>j6Ovru9hJZ<+TCy3BMjHb?c1rdC DZWt`?kxia{ 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 LbfHSaDeAufl0CBI literal 0 HcmV?d00001 diff --git a/VirtueSky/Utils/Editor/Icons/icon_adjust.png.meta b/VirtueSky/Utils/Editor/Icons/icon_adjust.png.meta new file mode 100644 index 00000000..276db99c --- /dev/null +++ b/VirtueSky/Utils/Editor/Icons/icon_adjust.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 4856817a41ca94c58b2293f27bee8195 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 50 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 50 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VirtueSky/Utils/Editor/Icons/icon_ads.png b/VirtueSky/Utils/Editor/Icons/icon_ads.png new file mode 100644 index 0000000000000000000000000000000000000000..e291fc416df82b7941739e88b3911b55f97ff5f5 GIT binary patch literal 7533 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 literal 0 HcmV?d00001 diff --git a/VirtueSky/Utils/Editor/Icons/icon_appsflyer.png.meta b/VirtueSky/Utils/Editor/Icons/icon_appsflyer.png.meta new file mode 100644 index 00000000..c04c0a65 --- /dev/null +++ b/VirtueSky/Utils/Editor/Icons/icon_appsflyer.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 927f854e1e4d440149078ed384de7fad +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 51 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 51 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VirtueSky/Utils/Editor/Icons/icon_audio.png b/VirtueSky/Utils/Editor/Icons/icon_audio.png new file mode 100644 index 0000000000000000000000000000000000000000..3f3eac7547937a2949ec75078ed7b86406481dc0 GIT binary patch literal 22378 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 literal 0 HcmV?d00001 diff --git a/VirtueSky/Utils/Editor/Icons/icon_extension.png.meta b/VirtueSky/Utils/Editor/Icons/icon_extension.png.meta new file mode 100644 index 00000000..1c9389a4 --- /dev/null +++ b/VirtueSky/Utils/Editor/Icons/icon_extension.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 53c2c285c95cf478eaffc4727383342e +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 53 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 53 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VirtueSky/Utils/Editor/Icons/icon_firebase.png b/VirtueSky/Utils/Editor/Icons/icon_firebase.png new file mode 100644 index 0000000000000000000000000000000000000000..782341bfd9c725a321f37fb004b59f097f069850 GIT binary patch literal 10597 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
^bRly@7tn!0~Ld93Sk0NYIVy?mLgh-F$`Yb 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 JPSqjqzW|-?cd7sY literal 0 HcmV?d00001 diff --git a/VirtueSky/Utils/Editor/Icons/icon_hierarchy.png.meta b/VirtueSky/Utils/Editor/Icons/icon_hierarchy.png.meta new file mode 100644 index 00000000..f7e019d4 --- /dev/null +++ b/VirtueSky/Utils/Editor/Icons/icon_hierarchy.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 422b56a3ea31444cd82f5ee33cbd31d4 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 50 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 50 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VirtueSky/Utils/Editor/Icons/icon_iap.png b/VirtueSky/Utils/Editor/Icons/icon_iap.png new file mode 100644 index 0000000000000000000000000000000000000000..b257f6f25a60af66f0bf916444aedac99ba96a2c GIT binary patch literal 21002 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 SIcNF+0000rJ^R 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 ZZm0k!!l1hMRR0_UD9WnIR7;tK{~u*8t>yp# literal 0 HcmV?d00001 diff --git a/VirtueSky/Utils/Editor/Icons/icon_package.png.meta b/VirtueSky/Utils/Editor/Icons/icon_package.png.meta new file mode 100644 index 00000000..4d50c79c --- /dev/null +++ b/VirtueSky/Utils/Editor/Icons/icon_package.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: a3c56005701154c35aea721ecd1f579a +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 50 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 50 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VirtueSky/Utils/Editor/Icons/icon_unity.png b/VirtueSky/Utils/Editor/Icons/icon_unity.png new file mode 100644 index 0000000000000000000000000000000000000000..809f23729f00ee2c27ca7726e4b3de7dfb1944ea GIT binary patch literal 4353 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 N{maJM)mqN6{|CA1O^pBm literal 0 HcmV?d00001 diff --git a/VirtueSky/Utils/Editor/Icons/icon_unity.png.meta b/VirtueSky/Utils/Editor/Icons/icon_unity.png.meta new file mode 100644 index 00000000..5601de44 --- /dev/null +++ b/VirtueSky/Utils/Editor/Icons/icon_unity.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 6af62e0e4e89e4e9a9b14e5f1bfbe28f +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 50 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 50 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: From cdec734841647115efb8bbea4034dabf2d846046 Mon Sep 17 00:00:00 2001 From: Ducnv Date: Thu, 22 Aug 2024 09:45:03 +0700 Subject: [PATCH 3/8] - update: Control panel p2 --- VirtueSky/ControlPanel/CPAppsFlyerDrawer.cs | 2 +- VirtueSky/ControlPanel/CPAssetFinderDrawer.cs | 2 +- VirtueSky/ControlPanel/CPExtensionsDrawer.cs | 2 +- VirtueSky/ControlPanel/CPFirebaseDrawer.cs | 2 +- VirtueSky/ControlPanel/CPFolderIconDrawer.cs | 2 +- VirtueSky/ControlPanel/CPGameServiceDrawer.cs | 2 +- VirtueSky/ControlPanel/CPHierarchyDrawer.cs | 2 +- VirtueSky/ControlPanel/CPInAppReviewDrawer.cs | 2 +- VirtueSky/ControlPanel/CPLevelEditorDrawer.cs | 4 ++-- VirtueSky/ControlPanel/CPNotificationChanelDrawer.cs | 2 +- VirtueSky/ControlPanel/CPRegisterPackageDrawer.cs | 2 +- VirtueSky/ControlPanel/CPScriptingDefineSymbolsDrawer.cs | 2 +- VirtueSky/ControlPanel/ControlPanelWindowEditor.cs | 2 +- package.json | 2 +- 14 files changed, 15 insertions(+), 15 deletions(-) diff --git a/VirtueSky/ControlPanel/CPAppsFlyerDrawer.cs b/VirtueSky/ControlPanel/CPAppsFlyerDrawer.cs index 13275580..f476753a 100644 --- a/VirtueSky/ControlPanel/CPAppsFlyerDrawer.cs +++ b/VirtueSky/ControlPanel/CPAppsFlyerDrawer.cs @@ -27,7 +27,7 @@ public static void OnDrawAppsFlyer() { GUILayout.Space(10); GUILayout.BeginVertical(); - GUILayout.Label("APPSFLYER", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.AppsFlyer, "APPSFLYER"); GUILayout.Space(10); scroll = EditorGUILayout.BeginScrollView(scroll); CPUtility.DrawButtonInstallPackage("Install AppsFlyer", "Remove AppsFlyer", diff --git a/VirtueSky/ControlPanel/CPAssetFinderDrawer.cs b/VirtueSky/ControlPanel/CPAssetFinderDrawer.cs index beed7652..d5139a32 100644 --- a/VirtueSky/ControlPanel/CPAssetFinderDrawer.cs +++ b/VirtueSky/ControlPanel/CPAssetFinderDrawer.cs @@ -10,7 +10,7 @@ public static void OnDrawAssetUsageDetector() { GUILayout.Space(10); GUILayout.BeginVertical(); - GUILayout.Label("ASSET FINDER", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.AssetsFinder, "ASSET FINDER"); GUILayout.Space(10); if (GUILayout.Button("Open Asset Finder Window (Ctrl+Shift+K / Command+Shift+K)")) { diff --git a/VirtueSky/ControlPanel/CPExtensionsDrawer.cs b/VirtueSky/ControlPanel/CPExtensionsDrawer.cs index 2351976a..f8779075 100644 --- a/VirtueSky/ControlPanel/CPExtensionsDrawer.cs +++ b/VirtueSky/ControlPanel/CPExtensionsDrawer.cs @@ -15,7 +15,7 @@ public static void OnDrawExtensions(Rect position) GUILayout.Space(10); GUILayout.BeginVertical(); #if UNITY_ANDROID - GUILayout.Label("ANDROID EXTERNAL TOOLS", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.Extensions, "ANDROID EXTERNAL TOOLS"); GUILayout.Space(10); if (GUILayout.Button("Open Sdk")) { diff --git a/VirtueSky/ControlPanel/CPFirebaseDrawer.cs b/VirtueSky/ControlPanel/CPFirebaseDrawer.cs index c74969a1..e3c3f73c 100644 --- a/VirtueSky/ControlPanel/CPFirebaseDrawer.cs +++ b/VirtueSky/ControlPanel/CPFirebaseDrawer.cs @@ -48,7 +48,7 @@ public static void OnDrawFirebase(Rect position) static void DrawRemoteConfig(Rect position) { - GUILayout.Label("FIREBASE REMOTE CONFIG", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.Firebase, "FIREBASE REMOTE CONFIG"); GUILayout.Space(10); isShowInstallRemoteConfig = GUILayout.Toggle(isShowInstallRemoteConfig, "Install Firebase Remote Config And Dependency"); diff --git a/VirtueSky/ControlPanel/CPFolderIconDrawer.cs b/VirtueSky/ControlPanel/CPFolderIconDrawer.cs index 9da626a8..66bff169 100644 --- a/VirtueSky/ControlPanel/CPFolderIconDrawer.cs +++ b/VirtueSky/ControlPanel/CPFolderIconDrawer.cs @@ -31,7 +31,7 @@ public static void OnDrawFolderIcon() { GUILayout.Space(10); GUILayout.BeginVertical(); - GUILayout.Label("FOLDER ICON", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.FolderIcon, "FOLDER ICON"); GUILayout.Space(10); scroll = EditorGUILayout.BeginScrollView(scroll); if (_settings == null) diff --git a/VirtueSky/ControlPanel/CPGameServiceDrawer.cs b/VirtueSky/ControlPanel/CPGameServiceDrawer.cs index 0afcdf2f..cd355a74 100644 --- a/VirtueSky/ControlPanel/CPGameServiceDrawer.cs +++ b/VirtueSky/ControlPanel/CPGameServiceDrawer.cs @@ -10,7 +10,7 @@ public static void OnDrawGameService() { GUILayout.Space(10); GUILayout.BeginVertical(); - GUILayout.Label("GAME SERVICE", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.GameService, "GAME SERVICE"); GUILayout.Space(10); CPUtility.DrawButtonInstallPackage("Install Apple Sign In", "Remove Apple Sign In", diff --git a/VirtueSky/ControlPanel/CPHierarchyDrawer.cs b/VirtueSky/ControlPanel/CPHierarchyDrawer.cs index bd3324d5..ae502893 100644 --- a/VirtueSky/ControlPanel/CPHierarchyDrawer.cs +++ b/VirtueSky/ControlPanel/CPHierarchyDrawer.cs @@ -14,7 +14,7 @@ public static void OnDrawQHierarchyEvent(Rect posittion, EditorWindow window) { GUILayout.Space(10); GUILayout.BeginVertical(); - GUILayout.Label("HIERARCHY", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.Hierarchy, "HIERARCHY"); GUILayout.Space(10); OnGUI(posittion, window); GUILayout.EndVertical(); diff --git a/VirtueSky/ControlPanel/CPInAppReviewDrawer.cs b/VirtueSky/ControlPanel/CPInAppReviewDrawer.cs index b43f34dd..dedc36dc 100644 --- a/VirtueSky/ControlPanel/CPInAppReviewDrawer.cs +++ b/VirtueSky/ControlPanel/CPInAppReviewDrawer.cs @@ -11,7 +11,7 @@ public static void OnDrawInAppReview(Rect position) { GUILayout.Space(10); GUILayout.BeginVertical(); - GUILayout.Label("IN APP REVIEW", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.InAppReview, "IN APP REVIEW"); GUILayout.Space(10); if (GUILayout.Button("Create Scriptable In App Review")) { diff --git a/VirtueSky/ControlPanel/CPLevelEditorDrawer.cs b/VirtueSky/ControlPanel/CPLevelEditorDrawer.cs index c10a85dc..dd3d81aa 100644 --- a/VirtueSky/ControlPanel/CPLevelEditorDrawer.cs +++ b/VirtueSky/ControlPanel/CPLevelEditorDrawer.cs @@ -19,7 +19,7 @@ public static void OnDrawLevelEditor(Rect position) { GUILayout.Space(10); GUILayout.BeginVertical(); - GUILayout.Label("LEVEL EDITOR", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.LevelEditor, "LEVEL EDITOR"); GUILayout.Space(10); var scriptableSetting = Resources.Load(nameof(LevelSystemEditorSetting)); if (scriptableSetting == null) @@ -31,7 +31,7 @@ public static void OnDrawLevelEditor(Rect position) const string path = "Assets/_Sunflower/Editor/Resources"; if (!Directory.Exists(path)) Directory.CreateDirectory(path); AssetDatabase.CreateAsset(setting, $"{path}/{nameof(LevelSystemEditorSetting)}.asset"); - RegistryManager.Add("com.unity.addressables", "1.21.20"); + RegistryManager.Add("com.unity.addressables", "1.21.21"); RegistryManager.Resolve(); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); diff --git a/VirtueSky/ControlPanel/CPNotificationChanelDrawer.cs b/VirtueSky/ControlPanel/CPNotificationChanelDrawer.cs index e032702a..368494c0 100644 --- a/VirtueSky/ControlPanel/CPNotificationChanelDrawer.cs +++ b/VirtueSky/ControlPanel/CPNotificationChanelDrawer.cs @@ -10,7 +10,7 @@ public static void OnDrawNotificationChanel(Rect position) { GUILayout.Space(10); GUILayout.BeginVertical(); - GUILayout.Label("NOTIFICATION CHANEL", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.NotificationsChanel, "NOTIFICATION"); GUILayout.Space(10); if (GUILayout.Button("Create Notification Chanel")) { diff --git a/VirtueSky/ControlPanel/CPRegisterPackageDrawer.cs b/VirtueSky/ControlPanel/CPRegisterPackageDrawer.cs index e3d9f976..16b21c27 100644 --- a/VirtueSky/ControlPanel/CPRegisterPackageDrawer.cs +++ b/VirtueSky/ControlPanel/CPRegisterPackageDrawer.cs @@ -14,7 +14,7 @@ public static void OnDrawRegisterPackageByManifest(Rect position) { GUILayout.Space(10); GUILayout.BeginVertical(); - GUILayout.Label("REGISTER SOME PACKAGE", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.RegisterPackage, "REGISTER PACKAGE"); GUILayout.Space(10); scrollPositionAddSomePackage = EditorGUILayout.BeginScrollView(scrollPositionAddSomePackage, GUILayout.Height(150)); diff --git a/VirtueSky/ControlPanel/CPScriptingDefineSymbolsDrawer.cs b/VirtueSky/ControlPanel/CPScriptingDefineSymbolsDrawer.cs index 8050185b..4a63bea6 100644 --- a/VirtueSky/ControlPanel/CPScriptingDefineSymbolsDrawer.cs +++ b/VirtueSky/ControlPanel/CPScriptingDefineSymbolsDrawer.cs @@ -12,7 +12,7 @@ public static void OnDrawScriptingDefineSymbols() { GUILayout.Space(10); GUILayout.BeginVertical(); - GUILayout.Label("SCRIPTING DEFINE SYMBOLS", EditorStyles.boldLabel); + CPUtility.DrawHeaderIcon(StatePanelControl.ScriptDefineSymbols, "SCRIPTING DEFINE SYMBOLS"); GUILayout.Space(10); scroll = EditorGUILayout.BeginScrollView(scroll); CPUtility.DrawButtonAddDefineSymbols(ConstantDefineSymbols.VIRTUESKY_ADS); diff --git a/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs b/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs index ef425209..c1359fe1 100644 --- a/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs +++ b/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs @@ -85,7 +85,7 @@ void DrawButton() DrawButtonChooseState("Game Service", StatePanelControl.GameService); DrawButtonChooseState("Folder Icon", StatePanelControl.FolderIcon); DrawButtonChooseState("Hierarchy", StatePanelControl.Hierarchy); - DrawButtonChooseState("Notifications Chanel", StatePanelControl.NotificationsChanel); + DrawButtonChooseState("Notifications", StatePanelControl.NotificationsChanel); DrawButtonChooseState("Scripting Define Symbols", StatePanelControl.ScriptDefineSymbols); DrawButtonChooseState("Register Package", StatePanelControl.RegisterPackage); DrawButtonChooseState("Extensions", StatePanelControl.Extensions); diff --git a/package.json b/package.json index c91bbcca..4794e1ef 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,6 @@ "com.unity.serialization": "3.1.1", "com.unity.collections": "2.1.4", "com.unity.textmeshpro": "3.0.8", - "com.unity.addressables": "1.21.20" + "com.unity.addressables": "1.21.21" } } \ No newline at end of file From b762e17e1b05921b387480b3719a885612f8a365 Mon Sep 17 00:00:00 2001 From: Ducnv Date: Thu, 22 Aug 2024 12:50:21 +0700 Subject: [PATCH 4/8] - update Control panel - p3 --- .../Advertising/Editor/AdSettingEditor.cs | 12 ++--- VirtueSky/ControlPanel/CPAboutDrawer.cs | 6 +-- VirtueSky/ControlPanel/CPAdjustDrawer.cs | 9 ++-- VirtueSky/ControlPanel/CPAdvertisingDrawer.cs | 16 +++---- VirtueSky/ControlPanel/CPAppsFlyerDrawer.cs | 9 ++-- VirtueSky/ControlPanel/CPAssetFinderDrawer.cs | 2 +- VirtueSky/ControlPanel/CPAudioDrawer.cs | 8 ++-- VirtueSky/ControlPanel/CPExtensionsDrawer.cs | 2 +- VirtueSky/ControlPanel/CPFirebaseDrawer.cs | 48 +++++++++++-------- VirtueSky/ControlPanel/CPFolderIconDrawer.cs | 2 +- VirtueSky/ControlPanel/CPGameServiceDrawer.cs | 4 +- VirtueSky/ControlPanel/CPHierarchyDrawer.cs | 2 +- VirtueSky/ControlPanel/CPIapDrawer.cs | 8 ++-- VirtueSky/ControlPanel/CPInAppReviewDrawer.cs | 6 +-- VirtueSky/ControlPanel/CPLevelEditorDrawer.cs | 2 +- .../CPNotificationChanelDrawer.cs | 6 +-- .../ControlPanel/CPRegisterPackageDrawer.cs | 2 +- .../CPScriptingDefineSymbolsDrawer.cs | 2 +- VirtueSky/ControlPanel/CPSoEventDrawer.cs | 6 +-- VirtueSky/ControlPanel/CPSoVariableDrawer.cs | 2 +- VirtueSky/ControlPanel/CPUtility.cs | 17 ++++++- .../ControlPanel/ControlPanelWindowEditor.cs | 5 +- 22 files changed, 96 insertions(+), 80 deletions(-) diff --git a/VirtueSky/Advertising/Editor/AdSettingEditor.cs b/VirtueSky/Advertising/Editor/AdSettingEditor.cs index e80348ac..274616cd 100644 --- a/VirtueSky/Advertising/Editor/AdSettingEditor.cs +++ b/VirtueSky/Advertising/Editor/AdSettingEditor.cs @@ -122,8 +122,8 @@ public override void OnInspectorGUI() void SetupMax() { - EditorGUILayout.LabelField("MAX", EditorStyles.boldLabel); - GuiLine(2); + EditorGUILayout.LabelField("Applovin - Max", EditorStyles.boldLabel); + GuiLine(1); GUILayout.Space(10); EditorGUILayout.PropertyField(_sdkKey); EditorGUILayout.PropertyField(_applovinEnableAgeRestrictedUser); @@ -196,8 +196,8 @@ void SetupMax() void SetupAdmob() { - EditorGUILayout.LabelField("ADMOB", EditorStyles.boldLabel); - GuiLine(2); + EditorGUILayout.LabelField("Google - Admob", EditorStyles.boldLabel); + GuiLine(1); GUILayout.Space(10); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PropertyField(_admobBannerVariable); @@ -279,8 +279,8 @@ void SetupAdmob() void SetupIronSource() { - EditorGUILayout.LabelField("IRON-SOURCE", EditorStyles.boldLabel); - GuiLine(2); + EditorGUILayout.LabelField("LevelPlay - IronSource", EditorStyles.boldLabel); + GuiLine(1); GUILayout.Space(10); EditorGUILayout.PropertyField(_androidAppKey); EditorGUILayout.PropertyField(_iOSAppKey); diff --git a/VirtueSky/ControlPanel/CPAboutDrawer.cs b/VirtueSky/ControlPanel/CPAboutDrawer.cs index 8bdd6f70..98b692e1 100644 --- a/VirtueSky/ControlPanel/CPAboutDrawer.cs +++ b/VirtueSky/ControlPanel/CPAboutDrawer.cs @@ -10,7 +10,7 @@ public static void OnDrawAbout(Rect position, Action drawSetting = null) { GUILayout.Space(10); GUILayout.BeginVertical(); - CPUtility.DrawHeaderIcon(StatePanelControl.About, "ABOUT"); + CPUtility.DrawHeaderIcon(StatePanelControl.About, "About"); GUILayout.Space(10); GUILayout.TextArea("Name: Sunflower", EditorStyles.boldLabel); GUILayout.TextArea( @@ -32,10 +32,6 @@ public static void OnDrawAbout(Rect position, Action drawSetting = null) GUILayout.Space(10); CPUtility.DrawLineLastRectY(3, ConstantControlPanel.POSITION_X_START_CONTENT, position.width); - // GUILayout.Space(20); - // GUILayout.Label("SETUP THEME", EditorStyles.boldLabel); - // GUILayout.Space(10); - // drawSetting?.Invoke(); GUILayout.EndVertical(); } } diff --git a/VirtueSky/ControlPanel/CPAdjustDrawer.cs b/VirtueSky/ControlPanel/CPAdjustDrawer.cs index bab04bab..857f3ddb 100644 --- a/VirtueSky/ControlPanel/CPAdjustDrawer.cs +++ b/VirtueSky/ControlPanel/CPAdjustDrawer.cs @@ -27,24 +27,25 @@ public static void OnDrawAdjust() { GUILayout.Space(10); GUILayout.BeginVertical(); - CPUtility.DrawHeaderIcon(StatePanelControl.Adjust, "ADJUST"); + CPUtility.DrawHeaderIcon(StatePanelControl.Adjust, "Adjust"); GUILayout.Space(10); CPUtility.DrawButtonInstallPackage("Install Adjust", "Remove Adjust", ConstantPackage.PackageNameAdjust, ConstantPackage.MaxVersionAdjust); GUILayout.Space(10); CPUtility.GuiLine(2); GUILayout.Space(10); + CPUtility.DrawHeader("Add define symbols"); + GUILayout.Space(10); #if !VIRTUESKY_ADJUST EditorGUILayout.HelpBox( $"Add scripting define symbols: {ConstantDefineSymbols.VIRTUESKY_ADJUST} for Adjust to use", MessageType.Info); #endif GUILayout.Space(10); - GUILayout.Label("ADD DEFINE SYMBOLS", EditorStyles.boldLabel); CPUtility.DrawButtonAddDefineSymbols(ConstantDefineSymbols.VIRTUESKY_ADJUST); GUILayout.Space(10); CPUtility.GuiLine(2); - GUILayout.Label("ADJUST SETTINGS", EditorStyles.boldLabel); + CPUtility.DrawHeader("Adjust Settings"); GUILayout.Space(10); if (_setting == null) { @@ -73,7 +74,7 @@ public static void OnDrawAdjust() GUILayout.Space(10); CPUtility.GuiLine(2); GUILayout.Space(10); - GUILayout.Label("ADJUST TRACKING", EditorStyles.boldLabel); + CPUtility.DrawHeader("Adjust Tracking"); GUILayout.Space(10); if (GUILayout.Button("Create Scriptable Tracking Adjust")) { diff --git a/VirtueSky/ControlPanel/CPAdvertisingDrawer.cs b/VirtueSky/ControlPanel/CPAdvertisingDrawer.cs index 48032950..753ba4d0 100644 --- a/VirtueSky/ControlPanel/CPAdvertisingDrawer.cs +++ b/VirtueSky/ControlPanel/CPAdvertisingDrawer.cs @@ -33,7 +33,7 @@ public static void OnDrawAdvertising(Rect position) { GUILayout.Space(10); GUILayout.BeginVertical(); - CPUtility.DrawHeaderIcon(StatePanelControl.Advertising, "ADVERTISING"); + CPUtility.DrawHeaderIcon(StatePanelControl.Advertising, "Advertising"); GUILayout.Space(10); scroll = EditorGUILayout.BeginScrollView(scroll); if (_adSetting == null) @@ -77,7 +77,7 @@ public static void OnDrawAdvertising(Rect position) GUILayout.Space(10); CPUtility.GuiLine(2); GUILayout.Space(10); - GUILayout.Label("PING ADS SETTING", EditorStyles.boldLabel); + CPUtility.DrawHeader("Ping Ads Settings"); GUILayout.Space(10); if (GUILayout.Button("Ping")) { @@ -103,7 +103,7 @@ static void DrawMaxField(Rect position) GUILayout.Space(10); CPUtility.GuiLine(2); GUILayout.Space(10); - GUILayout.Label("INSTALL MAX SDK", EditorStyles.boldLabel); + CPUtility.DrawHeader("Install Max Sdk"); GUILayout.Space(10); if (GUILayout.Button("Install Max Sdk Plugin")) { @@ -115,7 +115,7 @@ static void DrawMaxField(Rect position) GUILayout.Space(10); CPUtility.GuiLine(2); GUILayout.Space(10); - GUILayout.Label("ADD SYMBOLS", EditorStyles.boldLabel); + CPUtility.DrawHeader("Define Symbols"); GUILayout.Space(10); #if !VIRTUESKY_ADS || !VIRTUESKY_APPLOVIN EditorGUILayout.HelpBox( @@ -132,7 +132,7 @@ static void DrawAdmobField(Rect position) GUILayout.Space(10); CPUtility.GuiLine(2); GUILayout.Space(10); - GUILayout.Label("INSTALL ADMOB SDK", EditorStyles.boldLabel); + CPUtility.DrawHeader("Install Admob Sdk"); GUILayout.Space(10); if (GUILayout.Button("Install Admob Sdk Plugin")) { @@ -144,7 +144,7 @@ static void DrawAdmobField(Rect position) GUILayout.Space(10); CPUtility.GuiLine(2); GUILayout.Space(10); - GUILayout.Label("ADD SYMBOLS", EditorStyles.boldLabel); + CPUtility.DrawHeader("Define Symbols"); GUILayout.Space(10); #if !VIRTUESKY_ADS || !VIRTUESKY_ADMOB EditorGUILayout.HelpBox( @@ -161,7 +161,7 @@ static void DrawIronSource(Rect position) GUILayout.Space(10); CPUtility.GuiLine(2); GUILayout.Space(10); - GUILayout.Label("INSTALL IRON-SOURCE SDK", EditorStyles.boldLabel); + CPUtility.DrawHeader("Install IronSource Sdk"); GUILayout.Space(10); if (GUILayout.Button("Install IronSource Sdk Plugin")) { @@ -173,7 +173,7 @@ static void DrawIronSource(Rect position) GUILayout.Space(10); CPUtility.GuiLine(2); GUILayout.Space(10); - GUILayout.Label("ADD SYMBOLS", EditorStyles.boldLabel); + CPUtility.DrawHeader("Define Symbols"); GUILayout.Space(10); #if !VIRTUESKY_ADS || !VIRTUESKY_IRONSOURCE EditorGUILayout.HelpBox( diff --git a/VirtueSky/ControlPanel/CPAppsFlyerDrawer.cs b/VirtueSky/ControlPanel/CPAppsFlyerDrawer.cs index f476753a..aa7fbeff 100644 --- a/VirtueSky/ControlPanel/CPAppsFlyerDrawer.cs +++ b/VirtueSky/ControlPanel/CPAppsFlyerDrawer.cs @@ -27,7 +27,7 @@ public static void OnDrawAppsFlyer() { GUILayout.Space(10); GUILayout.BeginVertical(); - CPUtility.DrawHeaderIcon(StatePanelControl.AppsFlyer, "APPSFLYER"); + CPUtility.DrawHeaderIcon(StatePanelControl.AppsFlyer, "AppsFlyer"); GUILayout.Space(10); scroll = EditorGUILayout.BeginScrollView(scroll); CPUtility.DrawButtonInstallPackage("Install AppsFlyer", "Remove AppsFlyer", @@ -43,11 +43,12 @@ public static void OnDrawAppsFlyer() MessageType.Info); #endif GUILayout.Space(10); - GUILayout.Label("ADD DEFINE SYMBOLS", EditorStyles.boldLabel); + CPUtility.DrawHeader("Define Symbols"); + GUILayout.Space(10); CPUtility.DrawButtonAddDefineSymbols(ConstantDefineSymbols.VIRTUESKY_APPSFLYER); GUILayout.Space(10); CPUtility.GuiLine(2); - GUILayout.Label("APPSFLYER SETTINGS", EditorStyles.boldLabel); + CPUtility.DrawHeader("AppsFlyer Settings"); GUILayout.Space(10); if (_setting == null) { @@ -78,7 +79,7 @@ public static void OnDrawAppsFlyer() GUILayout.Space(10); CPUtility.GuiLine(2); - GUILayout.Label("APPSFLYER TRACKING", EditorStyles.boldLabel); + CPUtility.DrawHeader("AppsFlyer Tracking"); GUILayout.Space(10); if (GUILayout.Button("Create Scriptable Tracking AppsFlyer No Param")) diff --git a/VirtueSky/ControlPanel/CPAssetFinderDrawer.cs b/VirtueSky/ControlPanel/CPAssetFinderDrawer.cs index d5139a32..9b4b87e4 100644 --- a/VirtueSky/ControlPanel/CPAssetFinderDrawer.cs +++ b/VirtueSky/ControlPanel/CPAssetFinderDrawer.cs @@ -10,7 +10,7 @@ public static void OnDrawAssetUsageDetector() { GUILayout.Space(10); GUILayout.BeginVertical(); - CPUtility.DrawHeaderIcon(StatePanelControl.AssetsFinder, "ASSET FINDER"); + CPUtility.DrawHeaderIcon(StatePanelControl.AssetsFinder, "Asset Finder"); GUILayout.Space(10); if (GUILayout.Button("Open Asset Finder Window (Ctrl+Shift+K / Command+Shift+K)")) { diff --git a/VirtueSky/ControlPanel/CPAudioDrawer.cs b/VirtueSky/ControlPanel/CPAudioDrawer.cs index bf2fcde1..ea1e97d3 100644 --- a/VirtueSky/ControlPanel/CPAudioDrawer.cs +++ b/VirtueSky/ControlPanel/CPAudioDrawer.cs @@ -10,7 +10,7 @@ public static void OnDrawAudio(Rect position) { GUILayout.Space(10); GUILayout.BeginVertical(); - CPUtility.DrawHeaderIcon(StatePanelControl.Audio, "AUDIO"); + CPUtility.DrawHeaderIcon(StatePanelControl.Audio, "Audio"); GUILayout.Space(10); if (GUILayout.Button("Create Sound Data")) { @@ -20,7 +20,7 @@ public static void OnDrawAudio(Rect position) GUILayout.Space(10); CPUtility.DrawLineLastRectY(3, ConstantControlPanel.POSITION_X_START_CONTENT, position.width); GUILayout.Space(10); - GUILayout.Label("MUSIC EVENT", EditorStyles.boldLabel); + CPUtility.DrawHeader("Music Event"); GUILayout.Space(10); if (GUILayout.Button("Create Play Music Event")) { @@ -45,7 +45,7 @@ public static void OnDrawAudio(Rect position) GUILayout.Space(10); CPUtility.DrawLineLastRectY(3, ConstantControlPanel.POSITION_X_START_CONTENT, position.width); GUILayout.Space(10); - GUILayout.Label("SFX EVENT", EditorStyles.boldLabel); + CPUtility.DrawHeader("Sfx Event"); GUILayout.Space(10); if (GUILayout.Button("Create Play Sfx Event")) { @@ -80,7 +80,7 @@ public static void OnDrawAudio(Rect position) GUILayout.Space(10); CPUtility.DrawLineLastRectY(3, ConstantControlPanel.POSITION_X_START_CONTENT, position.width); GUILayout.Space(10); - GUILayout.Label("VOLUME CHANGE", EditorStyles.boldLabel); + CPUtility.DrawHeader("Volume Changed Variable"); GUILayout.Space(10); if (GUILayout.Button("Create Music Volume Variable")) { diff --git a/VirtueSky/ControlPanel/CPExtensionsDrawer.cs b/VirtueSky/ControlPanel/CPExtensionsDrawer.cs index f8779075..326064f1 100644 --- a/VirtueSky/ControlPanel/CPExtensionsDrawer.cs +++ b/VirtueSky/ControlPanel/CPExtensionsDrawer.cs @@ -15,7 +15,7 @@ public static void OnDrawExtensions(Rect position) GUILayout.Space(10); GUILayout.BeginVertical(); #if UNITY_ANDROID - CPUtility.DrawHeaderIcon(StatePanelControl.Extensions, "ANDROID EXTERNAL TOOLS"); + CPUtility.DrawHeaderIcon(StatePanelControl.Extensions, "Android External Tools"); GUILayout.Space(10); if (GUILayout.Button("Open Sdk")) { diff --git a/VirtueSky/ControlPanel/CPFirebaseDrawer.cs b/VirtueSky/ControlPanel/CPFirebaseDrawer.cs index e3c3f73c..35198fb2 100644 --- a/VirtueSky/ControlPanel/CPFirebaseDrawer.cs +++ b/VirtueSky/ControlPanel/CPFirebaseDrawer.cs @@ -9,8 +9,8 @@ namespace VirtueSky.ControlPanel.Editor { public static class CPFirebaseDrawer { - private static bool isShowInstallRemoteConfig; - private static bool isShowInstallAnalytic; + private static bool isShowInstallRemoteConfig = true; + private static bool isShowInstallAnalytic = true; private static Vector2 scroll = Vector2.zero; private static bool isCustomPackageName; private static string packageName; @@ -19,13 +19,13 @@ public static void OnDrawFirebase(Rect position) { GUILayout.Space(10); GUILayout.BeginVertical(); + CPUtility.DrawHeaderIcon(StatePanelControl.Firebase, "Firebase"); scroll = EditorGUILayout.BeginScrollView(scroll); - DrawRemoteConfig(position); - DrawAnalytic(position); + DrawInstallFirebase(position); GUILayout.Space(10); CPUtility.GuiLine(2); GUILayout.Space(10); - GUILayout.Label("ADD DEFINE SYMBOLS", EditorStyles.boldLabel); + CPUtility.DrawHeader("Define Symbols"); GUILayout.Space(10); #if !VIRTUESKY_FIREBASE || !VIRTUESKY_FIREBASE_REMOTECONFIG EditorGUILayout.HelpBox( @@ -41,15 +41,21 @@ public static void OnDrawFirebase(Rect position) MessageType.Info); #endif CPUtility.DrawButtonAddDefineSymbols(ConstantDefineSymbols.VIRTUESKY_FIREBASE_ANALYTIC); + GUILayout.Space(10); + DrawTracking(position); + +#if UNITY_ANDROID + CPUtility.GuiLine(2); + DrawDebugView(); +#endif GUILayout.Space(10); EditorGUILayout.EndScrollView(); GUILayout.EndVertical(); } - static void DrawRemoteConfig(Rect position) + static void DrawInstallFirebase(Rect position) { - CPUtility.DrawHeaderIcon(StatePanelControl.Firebase, "FIREBASE REMOTE CONFIG"); - GUILayout.Space(10); + GUILayout.Space(20); isShowInstallRemoteConfig = GUILayout.Toggle(isShowInstallRemoteConfig, "Install Firebase Remote Config And Dependency"); GUILayout.Space(10); @@ -65,14 +71,6 @@ static void DrawRemoteConfig(Rect position) ConstantPackage.MaxVersionGGExternalDependencyManager); } - GUILayout.Space(10); - CPUtility.GuiLine(2); - } - - static void DrawAnalytic(Rect position) - { - GUILayout.Space(10); - GUILayout.Label("FIREBASE ANALYTIC", EditorStyles.boldLabel); GUILayout.Space(10); isShowInstallAnalytic = GUILayout.Toggle(isShowInstallAnalytic, "Install Firebase Analytic And Dependency"); GUILayout.Space(10); @@ -87,10 +85,14 @@ static void DrawAnalytic(Rect position) ConstantPackage.PackageNameGGExternalDependencyManager, ConstantPackage.MaxVersionGGExternalDependencyManager); GUILayout.Space(10); - CPUtility.GuiLine(); } + } - + static void DrawTracking(Rect position) + { + CPUtility.GuiLine(2); + GUILayout.Space(10); + CPUtility.DrawHeader("Firebase Tracking"); GUILayout.Space(10); if (GUILayout.Button("Create Scriptable Tracking Firebase No Param")) @@ -129,8 +131,13 @@ static void DrawAnalytic(Rect position) } GUILayout.Space(10); -#if UNITY_ANDROID - CPUtility.GuiLine(); + } + + static void DrawDebugView() + { + GUILayout.Space(10); + CPUtility.DrawHeader("Debug View"); + GUILayout.Space(10); isCustomPackageName = EditorGUILayout.Toggle("Custom Package Name: ", isCustomPackageName); if (isCustomPackageName) { @@ -156,7 +163,6 @@ static void DrawAnalytic(Rect position) } GUILayout.EndHorizontal(); -#endif } static void SetDebugView(string package) diff --git a/VirtueSky/ControlPanel/CPFolderIconDrawer.cs b/VirtueSky/ControlPanel/CPFolderIconDrawer.cs index 66bff169..caf6b4a3 100644 --- a/VirtueSky/ControlPanel/CPFolderIconDrawer.cs +++ b/VirtueSky/ControlPanel/CPFolderIconDrawer.cs @@ -31,7 +31,7 @@ public static void OnDrawFolderIcon() { GUILayout.Space(10); GUILayout.BeginVertical(); - CPUtility.DrawHeaderIcon(StatePanelControl.FolderIcon, "FOLDER ICON"); + CPUtility.DrawHeaderIcon(StatePanelControl.FolderIcon, "Folder Icon"); GUILayout.Space(10); scroll = EditorGUILayout.BeginScrollView(scroll); if (_settings == null) diff --git a/VirtueSky/ControlPanel/CPGameServiceDrawer.cs b/VirtueSky/ControlPanel/CPGameServiceDrawer.cs index cd355a74..3a2f8af9 100644 --- a/VirtueSky/ControlPanel/CPGameServiceDrawer.cs +++ b/VirtueSky/ControlPanel/CPGameServiceDrawer.cs @@ -10,7 +10,7 @@ public static void OnDrawGameService() { GUILayout.Space(10); GUILayout.BeginVertical(); - CPUtility.DrawHeaderIcon(StatePanelControl.GameService, "GAME SERVICE"); + CPUtility.DrawHeaderIcon(StatePanelControl.GameService, "Game Service"); GUILayout.Space(10); CPUtility.DrawButtonInstallPackage("Install Apple Sign In", "Remove Apple Sign In", @@ -26,7 +26,7 @@ public static void OnDrawGameService() GUILayout.Space(10); CPUtility.GuiLine(); GUILayout.Space(10); - GUILayout.Label("ADD DEFINE SYMBOLS", EditorStyles.boldLabel); + CPUtility.DrawHeader("Define symbols"); GUILayout.Space(10); CPUtility.DrawButtonAddDefineSymbols(ConstantDefineSymbols.VIRTUESKY_APPLE_AUTH); CPUtility.DrawButtonAddDefineSymbols(ConstantDefineSymbols.VIRTUESKY_GPGS); diff --git a/VirtueSky/ControlPanel/CPHierarchyDrawer.cs b/VirtueSky/ControlPanel/CPHierarchyDrawer.cs index ae502893..9f1ec0c8 100644 --- a/VirtueSky/ControlPanel/CPHierarchyDrawer.cs +++ b/VirtueSky/ControlPanel/CPHierarchyDrawer.cs @@ -14,7 +14,7 @@ public static void OnDrawQHierarchyEvent(Rect posittion, EditorWindow window) { GUILayout.Space(10); GUILayout.BeginVertical(); - CPUtility.DrawHeaderIcon(StatePanelControl.Hierarchy, "HIERARCHY"); + CPUtility.DrawHeaderIcon(StatePanelControl.Hierarchy, "Hierarchy"); GUILayout.Space(10); OnGUI(posittion, window); GUILayout.EndVertical(); diff --git a/VirtueSky/ControlPanel/CPIapDrawer.cs b/VirtueSky/ControlPanel/CPIapDrawer.cs index 805e66ca..c8ac342d 100644 --- a/VirtueSky/ControlPanel/CPIapDrawer.cs +++ b/VirtueSky/ControlPanel/CPIapDrawer.cs @@ -38,7 +38,7 @@ public static void OnDrawIap(Rect position) { GUILayout.Space(10); GUILayout.BeginVertical(); - CPUtility.DrawHeaderIcon(StatePanelControl.InAppPurchase, "IN APP PURCHASE"); + CPUtility.DrawHeaderIcon(StatePanelControl.InAppPurchase, "In App Purchase"); GUILayout.Space(10); scroll = EditorGUILayout.BeginScrollView(scroll); #if VIRTUESKY_IAP @@ -111,7 +111,7 @@ public static void OnDrawIap(Rect position) // new Vector3(position.width, GUILayoutUtility.GetLastRect().y + 10)); CPUtility.GuiLine(2); GUILayout.Space(10); - GUILayout.Label("INSTALL PACKAGE IN APP PURCHASE", EditorStyles.boldLabel); + CPUtility.DrawHeader("Install Sdk"); GUILayout.Space(10); CPUtility.DrawButtonInstallPackage("Install In App Purchasing", "Remove In App Purchasing", ConstantPackage.PackageNameInAppPurchase, ConstantPackage.MaxVersionInAppPurchase); @@ -120,7 +120,7 @@ public static void OnDrawIap(Rect position) // new Vector3(position.width, GUILayoutUtility.GetLastRect().y + 10)); CPUtility.GuiLine(2); GUILayout.Space(10); - GUILayout.Label("ADD DEFINE SYMBOLS", EditorStyles.boldLabel); + CPUtility.DrawHeader("Define Symbols"); GUILayout.Space(10); #if !VIRTUESKY_IAP @@ -136,7 +136,7 @@ public static void OnDrawIap(Rect position) // new Vector3(position.width, GUILayoutUtility.GetLastRect().y + 10)); CPUtility.GuiLine(2); GUILayout.Space(10); - GUILayout.Label("PING IAP SETTING", EditorStyles.boldLabel); + GUILayout.Label("Ping Iap Settings", EditorStyles.boldLabel); GUILayout.Space(10); if (GUILayout.Button("Ping")) { diff --git a/VirtueSky/ControlPanel/CPInAppReviewDrawer.cs b/VirtueSky/ControlPanel/CPInAppReviewDrawer.cs index dedc36dc..dc964839 100644 --- a/VirtueSky/ControlPanel/CPInAppReviewDrawer.cs +++ b/VirtueSky/ControlPanel/CPInAppReviewDrawer.cs @@ -11,7 +11,7 @@ public static void OnDrawInAppReview(Rect position) { GUILayout.Space(10); GUILayout.BeginVertical(); - CPUtility.DrawHeaderIcon(StatePanelControl.InAppReview, "IN APP REVIEW"); + CPUtility.DrawHeaderIcon(StatePanelControl.InAppReview, "In App Review"); GUILayout.Space(10); if (GUILayout.Button("Create Scriptable In App Review")) { @@ -21,7 +21,7 @@ public static void OnDrawInAppReview(Rect position) GUILayout.Space(10); CPUtility.DrawLineLastRectY(3, ConstantControlPanel.POSITION_X_START_CONTENT, position.width); GUILayout.Space(10); - GUILayout.Label("INSTALL PACKAGE IN APP REVIEW", EditorStyles.boldLabel); + CPUtility.DrawHeader("Install Sdk"); GUILayout.Space(10); CPUtility.DrawButtonInstallPackage("Install Google Play Review", "Remove Google Play Review", ConstantPackage.PackageNameGGPlayReview, ConstantPackage.MaxVersionGGPlayReview); @@ -39,7 +39,7 @@ public static void OnDrawInAppReview(Rect position) GUILayout.Space(10); CPUtility.DrawLineLastRectY(3, ConstantControlPanel.POSITION_X_START_CONTENT, position.width); GUILayout.Space(10); - GUILayout.Label("ADD DEFINE SYMBOLS", EditorStyles.boldLabel); + CPUtility.DrawHeader("Define symbols"); GUILayout.Space(10); #if !VIRTUESKY_RATING EditorGUILayout.HelpBox( diff --git a/VirtueSky/ControlPanel/CPLevelEditorDrawer.cs b/VirtueSky/ControlPanel/CPLevelEditorDrawer.cs index dd3d81aa..65ed39b7 100644 --- a/VirtueSky/ControlPanel/CPLevelEditorDrawer.cs +++ b/VirtueSky/ControlPanel/CPLevelEditorDrawer.cs @@ -19,7 +19,7 @@ public static void OnDrawLevelEditor(Rect position) { GUILayout.Space(10); GUILayout.BeginVertical(); - CPUtility.DrawHeaderIcon(StatePanelControl.LevelEditor, "LEVEL EDITOR"); + CPUtility.DrawHeaderIcon(StatePanelControl.LevelEditor, "Level Editor"); GUILayout.Space(10); var scriptableSetting = Resources.Load(nameof(LevelSystemEditorSetting)); if (scriptableSetting == null) diff --git a/VirtueSky/ControlPanel/CPNotificationChanelDrawer.cs b/VirtueSky/ControlPanel/CPNotificationChanelDrawer.cs index 368494c0..34a21b8f 100644 --- a/VirtueSky/ControlPanel/CPNotificationChanelDrawer.cs +++ b/VirtueSky/ControlPanel/CPNotificationChanelDrawer.cs @@ -10,7 +10,7 @@ public static void OnDrawNotificationChanel(Rect position) { GUILayout.Space(10); GUILayout.BeginVertical(); - CPUtility.DrawHeaderIcon(StatePanelControl.NotificationsChanel, "NOTIFICATION"); + CPUtility.DrawHeaderIcon(StatePanelControl.NotificationsChanel, "Notifications"); GUILayout.Space(10); if (GUILayout.Button("Create Notification Chanel")) { @@ -20,14 +20,14 @@ public static void OnDrawNotificationChanel(Rect position) GUILayout.Space(10); CPUtility.DrawLineLastRectY(3, ConstantControlPanel.POSITION_X_START_CONTENT, position.width); GUILayout.Space(10); - GUILayout.Label("INSTALL MOBILE NOTIFICATIONS", EditorStyles.boldLabel); + CPUtility.DrawHeader("Install Sdk"); GUILayout.Space(10); CPUtility.DrawButtonInstallPackage("Install Mobile Notifications", "Remove Mobile Notifications", ConstantPackage.PackageNameMobileNotification, ConstantPackage.MaxVersionMobileNotification); GUILayout.Space(10); CPUtility.DrawLineLastRectY(3, ConstantControlPanel.POSITION_X_START_CONTENT, position.width); GUILayout.Space(10); - GUILayout.Label("ADD DEFINE SYMBOLS", EditorStyles.boldLabel); + CPUtility.DrawHeader("Define Symbols"); GUILayout.Space(10); #if !VIRTUESKY_NOTIFICATION EditorGUILayout.HelpBox( diff --git a/VirtueSky/ControlPanel/CPRegisterPackageDrawer.cs b/VirtueSky/ControlPanel/CPRegisterPackageDrawer.cs index 16b21c27..3a54ca91 100644 --- a/VirtueSky/ControlPanel/CPRegisterPackageDrawer.cs +++ b/VirtueSky/ControlPanel/CPRegisterPackageDrawer.cs @@ -14,7 +14,7 @@ public static void OnDrawRegisterPackageByManifest(Rect position) { GUILayout.Space(10); GUILayout.BeginVertical(); - CPUtility.DrawHeaderIcon(StatePanelControl.RegisterPackage, "REGISTER PACKAGE"); + CPUtility.DrawHeaderIcon(StatePanelControl.RegisterPackage, "Register Package"); GUILayout.Space(10); scrollPositionAddSomePackage = EditorGUILayout.BeginScrollView(scrollPositionAddSomePackage, GUILayout.Height(150)); diff --git a/VirtueSky/ControlPanel/CPScriptingDefineSymbolsDrawer.cs b/VirtueSky/ControlPanel/CPScriptingDefineSymbolsDrawer.cs index 4a63bea6..430ef5d7 100644 --- a/VirtueSky/ControlPanel/CPScriptingDefineSymbolsDrawer.cs +++ b/VirtueSky/ControlPanel/CPScriptingDefineSymbolsDrawer.cs @@ -12,7 +12,7 @@ public static void OnDrawScriptingDefineSymbols() { GUILayout.Space(10); GUILayout.BeginVertical(); - CPUtility.DrawHeaderIcon(StatePanelControl.ScriptDefineSymbols, "SCRIPTING DEFINE SYMBOLS"); + CPUtility.DrawHeaderIcon(StatePanelControl.ScriptDefineSymbols, "Scripting Define Symbols"); GUILayout.Space(10); scroll = EditorGUILayout.BeginScrollView(scroll); CPUtility.DrawButtonAddDefineSymbols(ConstantDefineSymbols.VIRTUESKY_ADS); diff --git a/VirtueSky/ControlPanel/CPSoEventDrawer.cs b/VirtueSky/ControlPanel/CPSoEventDrawer.cs index 6cf7379b..385afeb8 100644 --- a/VirtueSky/ControlPanel/CPSoEventDrawer.cs +++ b/VirtueSky/ControlPanel/CPSoEventDrawer.cs @@ -15,12 +15,12 @@ public static void OnDrawSoEvent() { GUILayout.Space(10); GUILayout.BeginVertical(); - CPUtility.DrawHeaderIcon(StatePanelControl.SO_Event, "SCRIPTABLE EVENT"); + CPUtility.DrawHeaderIcon(StatePanelControl.SO_Event, "Scriptable Events"); GUILayout.Space(10); scroll = GUILayout.BeginScrollView(scroll); - CPUtility.DrawToggle(ref isShowFielEvent, "Scriptable Event", () => DrawButtonEvent()); + CPUtility.DrawToggle(ref isShowFielEvent, "Scriptable Event", DrawButtonEvent); GUILayout.Space(10); - CPUtility.DrawToggle(ref isShowFielEventResult, "Scriptable Event-Result", () => DrawButtonEventResult()); + CPUtility.DrawToggle(ref isShowFielEventResult, "Scriptable Event-Result", DrawButtonEventResult); GUILayout.EndScrollView(); GUILayout.EndVertical(); } diff --git a/VirtueSky/ControlPanel/CPSoVariableDrawer.cs b/VirtueSky/ControlPanel/CPSoVariableDrawer.cs index 57c0b271..688b8342 100644 --- a/VirtueSky/ControlPanel/CPSoVariableDrawer.cs +++ b/VirtueSky/ControlPanel/CPSoVariableDrawer.cs @@ -10,7 +10,7 @@ public static void OnDrawSoVariable() { GUILayout.Space(10); GUILayout.BeginVertical(); - CPUtility.DrawHeaderIcon(StatePanelControl.SO_Variable, "SCRIPTABLE VARIABLE"); + CPUtility.DrawHeaderIcon(StatePanelControl.SO_Variable, "Scriptable Variables"); GUILayout.Space(10); if (GUILayout.Button("Create Boolean Variable")) { diff --git a/VirtueSky/ControlPanel/CPUtility.cs b/VirtueSky/ControlPanel/CPUtility.cs index e6fba00e..ae785a66 100644 --- a/VirtueSky/ControlPanel/CPUtility.cs +++ b/VirtueSky/ControlPanel/CPUtility.cs @@ -133,14 +133,27 @@ public static Texture2D GetIcon(StatePanelControl statePanelControl) }; } - public static void DrawHeaderIcon(StatePanelControl statePanelControl, string textHeader) + public static void DrawHeaderIcon(StatePanelControl statePanelControl, string textHeader, int _fontSize = 17) { GUILayout.BeginHorizontal(); GUILayout.Box(CPUtility.GetIcon(statePanelControl), GUIStyle.none, GUILayout.Width(32), GUILayout.Height(32)); GUILayout.Space(3); - GUILayout.Label(textHeader, EditorStyles.boldLabel, GUILayout.ExpandHeight(false)); + GUIStyle headerStyle = new GUIStyle(EditorStyles.boldLabel) + { + fontSize = _fontSize + }; + GUILayout.Label(textHeader, headerStyle, GUILayout.ExpandHeight(false), GUILayout.Height(31)); GUILayout.EndHorizontal(); } + + public static void DrawHeader(string textHeader, int _fontSize = 16) + { + GUIStyle headerStyle = new GUIStyle(EditorStyles.boldLabel) + { + fontSize = _fontSize + }; + GUILayout.Label(textHeader, headerStyle); + } } } \ No newline at end of file diff --git a/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs b/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs index c1359fe1..8afc7943 100644 --- a/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs +++ b/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs @@ -45,13 +45,12 @@ private void OnDisable() private void OnGUI() { - GUILayout.Space(10); GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); - GUILayout.Label("SUNFLOWER CONTROL PANEL", EditorStyles.boldLabel); + CPUtility.DrawHeader("Sunflower Control Panel", 17); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); - + GUILayout.Space(10); Handles.color = Color.black; Handles.DrawAAPolyLine(4, new Vector3(0, 30), new Vector3(position.width, 30)); // GuiLine(2, Color.black); From db049ac12b0c06b054ecde5a198dc030018f72df Mon Sep 17 00:00:00 2001 From: Ducnv Date: Thu, 22 Aug 2024 12:52:21 +0700 Subject: [PATCH 5/8] - update max sdk 6.6.3 --- .../Editor/UnityPackage/Note_Package.txt | 2 +- .../Editor/UnityPackage/max-sdk.unitypackage | Bin 600990 -> 601395 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/VirtueSky/Utils/Editor/UnityPackage/Note_Package.txt b/VirtueSky/Utils/Editor/UnityPackage/Note_Package.txt index 3206dbc2..4cd9214d 100644 --- a/VirtueSky/Utils/Editor/UnityPackage/Note_Package.txt +++ b/VirtueSky/Utils/Editor/UnityPackage/Note_Package.txt @@ -1,4 +1,4 @@ -- Version Max Sdk: 6.6.2 +- Version Max Sdk: 6.6.3 - Version Admob Sdk: v9.2.0 - Version IronSource (UnityLevelPlay) Skd: 8.1.0 - Version Google Game Play Service: v11.01 \ No newline at end of file diff --git a/VirtueSky/Utils/Editor/UnityPackage/max-sdk.unitypackage b/VirtueSky/Utils/Editor/UnityPackage/max-sdk.unitypackage index b4ed090dab4e4cbc87ca1ab1a78de58243c7f38d..d20217c09881290fe3bd7c9937153ae57a6ef3fa 100644 GIT binary patch delta 572790 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%0AnOX|N31mWx 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%0D*%CPyS zP$Ln$e>&wJkK4lzrVKeHSAGwIQVqF1Y_2;!T^u%;XK!%r=p}J=kytxgF(%NGh@t}( z%Uc~CSix1aFLSlFy1Y&lrBXto4CO*ll-#q#hd^%#hE5I46aSJIr9nK}n=3*+R$Osb zm&;>_P&orwIk|=lq+>SdX%KjgS8eyQleHW!xm5| z0aF)@QL9_F{K1u#SFLH)T31FnjX*75yhdH?4KCpQs}OHcg+tdYP%9BH8FW~Rg&qdb zUzkq{P`8kS?=>hwiPdqL3aL4~g5^&}xeeiV=NA7}?SW=4ghvj&r5akP$_tr)-l0oA zf07Dz0=*&rpI2(e>TV2Dn|~>R#a6>6_;h~gkWNc*w9&Ju3T-Tuz^jJURGSEl)I8-d zS5e0L*Fh4&)u3lWL zMe-})RtF5SaX14D8e~xFcBniCO`#XYe{<_{RY@{9YQj+wo$wF6kZB%oxm82^HV`Ej zCIAOLPI4k~8%7}phq}Cx7Jpu4XsE@G*6vPM1N1J*RHu{EurBB#J+jQ{@InaM*f9&F zcNl^JxvNlm${R4f!5CK{gobpgZKe{VqGcsIRQC>v@^9P7Naa8Idm*r#3(lz$f3@!M zl6inM1fbkFS>aJiX_?DQiYJ)fc3gxkaHXLqgNcFrm8$U#%2zPPztRZC1P6)S-w^c{ zj0M>Sl2E(c z+E~%lM2Fn^{dGU|ud5YSZb>6|wOoUU4%b#^>td&?xup|**Xrsd*PKU+K z&{tr!3y16Y@i0W@42e|Bv2wXlDK|m=z}3zcgEvJu;TE zyn&^Yzj)evpw25XZbl5VkvBMS z3_AURpq8ODxhcXSc_jz^SBg!WF+7_^L#x~CT;pnQbZ-$`pO2FAz(e z-F~e}!C;03-9s^SKQQpWl1#!ktSF{bFH#--AnE4PUhEoc4$_D)0QoQ?>^-cE-d#e>eI3AH*jv*nPp4 z*j<<1p7PiFRr4RWz8Js1S`4hXUO#-KsX#fBSUlLmxlT_xj!6nku~@ zl_~RZ<-MZVD*k+P<;C01E?97Q<6C2QT>0=@D%0AwR+X{Pz3y)M@6%_WeC^urKQVFH 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 VP3yn&M~qq3x1=(Kk`YXfp^ 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

+|PIpYu$(O@hnknLy#3@_B&*N*4-w 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 From 86254f5bdb3715cf232068947ce764d9a6424abb Mon Sep 17 00:00:00 2001 From: Ducnv Date: Thu, 22 Aug 2024 15:06:33 +0700 Subject: [PATCH 6/8] - remove: Module UniTask --- .../ControlPanel/CPRegisterPackageDrawer.cs | 2 + VirtueSky/ControlPanel/ConstantPackage.cs | 5 + VirtueSky/UniTask.meta | 8 - VirtueSky/UniTask/Editor.meta | 8 - VirtueSky/UniTask/Editor/SplitterGUILayout.cs | 62 - .../UniTask/Editor/SplitterGUILayout.cs.meta | 11 - .../UniTask/Editor/UniTaskTrackerTreeView.cs | 182 - .../Editor/UniTaskTrackerTreeView.cs.meta | 11 - .../UniTask/Editor/UniTaskTrackerWindow.cs | 209 - .../Editor/UniTaskTrackerWindow.cs.meta | 11 - .../VirtueSky.Sunflower.UniTask.Editor.asmdef | 18 - ...ueSky.Sunflower.UniTask.Editor.asmdef.meta | 7 - VirtueSky/UniTask/Runtime.meta | 8 - VirtueSky/UniTask/Runtime/AsyncLazy.cs | 245 - VirtueSky/UniTask/Runtime/AsyncLazy.cs.meta | 11 - .../UniTask/Runtime/AsyncReactiveProperty.cs | 644 - .../Runtime/AsyncReactiveProperty.cs.meta | 11 - VirtueSky/UniTask/Runtime/AsyncUnit.cs | 26 - VirtueSky/UniTask/Runtime/AsyncUnit.cs.meta | 11 - .../CancellationTokenEqualityComparer.cs | 23 - .../CancellationTokenEqualityComparer.cs.meta | 11 - .../Runtime/CancellationTokenExtensions.cs | 182 - .../CancellationTokenExtensions.cs.meta | 11 - .../CancellationTokenSourceExtensions.cs | 44 - .../CancellationTokenSourceExtensions.cs.meta | 11 - VirtueSky/UniTask/Runtime/Channel.cs | 450 - VirtueSky/UniTask/Runtime/Channel.cs.meta | 11 - .../UniTask/Runtime/CompilerServices.meta | 8 - .../AsyncMethodBuilderAttribute.cs | 17 - .../AsyncMethodBuilderAttribute.cs.meta | 11 - .../AsyncUniTaskMethodBuilder.cs | 269 - .../AsyncUniTaskMethodBuilder.cs.meta | 11 - .../AsyncUniTaskVoidMethodBuilder.cs | 137 - .../AsyncUniTaskVoidMethodBuilder.cs.meta | 11 - .../CompilerServices/StateMachineRunner.cs | 380 - .../StateMachineRunner.cs.meta | 11 - .../Runtime/EnumerableAsyncExtensions.cs | 34 - .../Runtime/EnumerableAsyncExtensions.cs.meta | 11 - .../Runtime/EnumeratorAsyncExtensions.cs | 287 - .../Runtime/EnumeratorAsyncExtensions.cs.meta | 11 - .../UniTask/Runtime/ExceptionExtensions.cs | 14 - .../Runtime/ExceptionExtensions.cs.meta | 11 - VirtueSky/UniTask/Runtime/External.meta | 8 - .../Runtime/External/Addressables.meta | 8 - .../AddressablesAsyncExtensions.cs | 473 - .../AddressablesAsyncExtensions.cs.meta | 11 - .../UniTask/Runtime/External/DOTween.meta | 8 - .../DOTween/DOTweenAsyncExtensions.cs | 436 - .../DOTween/DOTweenAsyncExtensions.cs.meta | 11 - .../UniTask/Runtime/External/TextMeshPro.meta | 8 - .../TextMeshProAsyncExtensions.InputField.cs | 224 - ...tMeshProAsyncExtensions.InputField.cs.meta | 11 - .../TextMeshPro/TextMeshProAsyncExtensions.cs | 130 - .../TextMeshProAsyncExtensions.cs.meta | 11 - .../Runtime/IUniTaskAsyncEnumerable.cs | 91 - .../Runtime/IUniTaskAsyncEnumerable.cs.meta | 11 - VirtueSky/UniTask/Runtime/IUniTaskSource.cs | 127 - .../UniTask/Runtime/IUniTaskSource.cs.meta | 11 - VirtueSky/UniTask/Runtime/Internal.meta | 8 - .../UniTask/Runtime/Internal/ArrayPool.cs | 150 - .../Runtime/Internal/ArrayPool.cs.meta | 12 - .../UniTask/Runtime/Internal/ArrayPoolUtil.cs | 115 - .../Runtime/Internal/ArrayPoolUtil.cs.meta | 12 - .../UniTask/Runtime/Internal/ArrayUtil.cs | 73 - .../Runtime/Internal/ArrayUtil.cs.meta | 12 - .../Runtime/Internal/ContinuationQueue.cs | 225 - .../Internal/ContinuationQueue.cs.meta | 11 - .../Runtime/Internal/DiagnosticsExtensions.cs | 249 - .../Internal/DiagnosticsExtensions.cs.meta | 11 - VirtueSky/UniTask/Runtime/Internal/Error.cs | 79 - .../UniTask/Runtime/Internal/Error.cs.meta | 12 - .../UniTask/Runtime/Internal/MinimumQueue.cs | 112 - .../Runtime/Internal/MinimumQueue.cs.meta | 11 - .../Runtime/Internal/PlayerLoopRunner.cs | 260 - .../Runtime/Internal/PlayerLoopRunner.cs.meta | 11 - .../Runtime/Internal/PooledDelegate.cs | 50 - .../Runtime/Internal/PooledDelegate.cs.meta | 11 - .../Internal/RuntimeHelpersAbstraction.cs | 64 - .../RuntimeHelpersAbstraction.cs.meta | 12 - .../UniTask/Runtime/Internal/StatePool.cs | 153 - .../Runtime/Internal/StatePool.cs.meta | 11 - .../UniTask/Runtime/Internal/TaskTracker.cs | 178 - .../Runtime/Internal/TaskTracker.cs.meta | 11 - .../Runtime/Internal/UnityEqualityComparer.cs | 267 - .../Internal/UnityEqualityComparer.cs.meta | 11 - .../Internal/UnityWebRequestExtensions.cs | 28 - .../UnityWebRequestExtensions.cs.meta | 11 - .../Runtime/Internal/ValueStopwatch.cs | 37 - .../Runtime/Internal/ValueStopwatch.cs.meta | 11 - .../Runtime/Internal/WeakDictionary.cs | 334 - .../Runtime/Internal/WeakDictionary.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq.meta | 8 - VirtueSky/UniTask/Runtime/Linq/Aggregate.cs | 318 - .../UniTask/Runtime/Linq/Aggregate.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/All.cs | 108 - VirtueSky/UniTask/Runtime/Linq/All.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Any.cs | 136 - VirtueSky/UniTask/Runtime/Linq/Any.cs.meta | 11 - .../UniTask/Runtime/Linq/AppendPrepend.cs | 151 - .../Runtime/Linq/AppendPrepend.cs.meta | 11 - .../Runtime/Linq/AsUniTaskAsyncEnumerable.cs | 10 - .../Linq/AsUniTaskAsyncEnumerable.cs.meta | 11 - .../Runtime/Linq/AsyncEnumeratorBase.cs | 356 - .../Runtime/Linq/AsyncEnumeratorBase.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Average.cs | 1524 --- .../UniTask/Runtime/Linq/Average.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Buffer.cs | 345 - VirtueSky/UniTask/Runtime/Linq/Buffer.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Cast.cs | 53 - VirtueSky/UniTask/Runtime/Linq/Cast.cs.meta | 11 - .../UniTask/Runtime/Linq/CombineLatest.cs | 11372 ---------------- .../Runtime/Linq/CombineLatest.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Concat.cs | 164 - VirtueSky/UniTask/Runtime/Linq/Concat.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Contains.cs | 50 - .../UniTask/Runtime/Linq/Contains.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Count.cs | 144 - VirtueSky/UniTask/Runtime/Linq/Count.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Create.cs | 184 - VirtueSky/UniTask/Runtime/Linq/Create.cs.meta | 11 - .../UniTask/Runtime/Linq/DefaultIfEmpty.cs | 142 - .../Runtime/Linq/DefaultIfEmpty.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Distinct.cs | 277 - .../UniTask/Runtime/Linq/Distinct.cs.meta | 11 - .../Runtime/Linq/DistinctUntilChanged.cs | 662 - .../Runtime/Linq/DistinctUntilChanged.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Do.cs | 258 - VirtueSky/UniTask/Runtime/Linq/Do.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/ElementAt.cs | 58 - .../UniTask/Runtime/Linq/ElementAt.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Empty.cs | 47 - VirtueSky/UniTask/Runtime/Linq/Empty.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Except.cs | 116 - VirtueSky/UniTask/Runtime/Linq/Except.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/First.cs | 200 - VirtueSky/UniTask/Runtime/Linq/First.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/ForEach.cs | 193 - .../UniTask/Runtime/Linq/ForEach.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/GroupBy.cs | 923 -- .../UniTask/Runtime/Linq/GroupBy.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/GroupJoin.cs | 612 - .../UniTask/Runtime/Linq/GroupJoin.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Intersect.cs | 117 - .../UniTask/Runtime/Linq/Intersect.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Join.cs | 728 - VirtueSky/UniTask/Runtime/Linq/Join.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Last.cs | 240 - VirtueSky/UniTask/Runtime/Linq/Last.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/LongCount.cs | 144 - .../UniTask/Runtime/Linq/LongCount.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Max.cs | 200 - VirtueSky/UniTask/Runtime/Linq/Max.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Merge.cs | 234 - VirtueSky/UniTask/Runtime/Linq/Merge.cs.meta | 3 - VirtueSky/UniTask/Runtime/Linq/Min.cs | 200 - VirtueSky/UniTask/Runtime/Linq/Min.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/MinMax.cs | 3763 ----- VirtueSky/UniTask/Runtime/Linq/MinMax.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Never.cs | 56 - VirtueSky/UniTask/Runtime/Linq/Never.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/OfType.cs | 61 - VirtueSky/UniTask/Runtime/Linq/OfType.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/OrderBy.cs | 558 - .../UniTask/Runtime/Linq/OrderBy.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Pairwise.cs | 128 - .../UniTask/Runtime/Linq/Pairwise.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Publish.cs | 173 - .../UniTask/Runtime/Linq/Publish.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Queue.cs | 103 - VirtueSky/UniTask/Runtime/Linq/Queue.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Range.cs | 75 - VirtueSky/UniTask/Runtime/Linq/Range.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Repeat.cs | 68 - VirtueSky/UniTask/Runtime/Linq/Repeat.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Return.cs | 63 - VirtueSky/UniTask/Runtime/Linq/Return.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Reverse.cs | 78 - .../UniTask/Runtime/Linq/Reverse.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Select.cs | 760 -- VirtueSky/UniTask/Runtime/Linq/Select.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/SelectMany.cs | 892 -- .../UniTask/Runtime/Linq/SelectMany.cs.meta | 11 - .../UniTask/Runtime/Linq/SequenceEqual.cs | 87 - .../Runtime/Linq/SequenceEqual.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Single.cs | 230 - VirtueSky/UniTask/Runtime/Linq/Single.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Skip.cs | 69 - VirtueSky/UniTask/Runtime/Linq/Skip.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/SkipLast.cs | 159 - .../UniTask/Runtime/Linq/SkipLast.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/SkipUntil.cs | 187 - .../UniTask/Runtime/Linq/SkipUntil.cs.meta | 11 - .../UniTask/Runtime/Linq/SkipUntilCanceled.cs | 173 - .../Runtime/Linq/SkipUntilCanceled.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/SkipWhile.cs | 379 - .../UniTask/Runtime/Linq/SkipWhile.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Subscribe.cs | 536 - .../UniTask/Runtime/Linq/Subscribe.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Sum.cs | 1244 -- VirtueSky/UniTask/Runtime/Linq/Sum.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Take.cs | 124 - VirtueSky/UniTask/Runtime/Linq/Take.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/TakeLast.cs | 175 - .../UniTask/Runtime/Linq/TakeLast.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/TakeUntil.cs | 190 - .../UniTask/Runtime/Linq/TakeUntil.cs.meta | 11 - .../UniTask/Runtime/Linq/TakeUntilCanceled.cs | 164 - .../Runtime/Linq/TakeUntilCanceled.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/TakeWhile.cs | 342 - .../UniTask/Runtime/Linq/TakeWhile.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Throw.cs | 54 - VirtueSky/UniTask/Runtime/Linq/Throw.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/ToArray.cs | 60 - .../UniTask/Runtime/Linq/ToArray.cs.meta | 11 - .../UniTask/Runtime/Linq/ToDictionary.cs | 278 - .../UniTask/Runtime/Linq/ToDictionary.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/ToHashSet.cs | 50 - .../UniTask/Runtime/Linq/ToHashSet.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/ToList.cs | 42 - VirtueSky/UniTask/Runtime/Linq/ToList.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/ToLookup.cs | 554 - .../UniTask/Runtime/Linq/ToLookup.cs.meta | 11 - .../UniTask/Runtime/Linq/ToObservable.cs | 97 - .../UniTask/Runtime/Linq/ToObservable.cs.meta | 11 - .../Runtime/Linq/ToUniTaskAsyncEnumerable.cs | 1115 -- .../Linq/ToUniTaskAsyncEnumerable.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Union.cs | 26 - VirtueSky/UniTask/Runtime/Linq/Union.cs.meta | 11 - .../UniTask/Runtime/Linq/UnityExtensions.meta | 8 - .../Linq/UnityExtensions/EveryUpdate.cs | 100 - .../Linq/UnityExtensions/EveryUpdate.cs.meta | 11 - .../Linq/UnityExtensions/EveryValueChanged.cs | 292 - .../UnityExtensions/EveryValueChanged.cs.meta | 11 - .../Runtime/Linq/UnityExtensions/Timer.cs | 355 - .../Linq/UnityExtensions/Timer.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Where.cs | 818 -- VirtueSky/UniTask/Runtime/Linq/Where.cs.meta | 11 - VirtueSky/UniTask/Runtime/Linq/Zip.cs | 541 - VirtueSky/UniTask/Runtime/Linq/Zip.cs.meta | 11 - VirtueSky/UniTask/Runtime/MoveNextSource.cs | 63 - .../UniTask/Runtime/MoveNextSource.cs.meta | 11 - VirtueSky/UniTask/Runtime/PlayerLoopHelper.cs | 581 - .../UniTask/Runtime/PlayerLoopHelper.cs.meta | 11 - VirtueSky/UniTask/Runtime/PlayerLoopTimer.cs | 262 - .../UniTask/Runtime/PlayerLoopTimer.cs.meta | 11 - VirtueSky/UniTask/Runtime/Progress.cs | 87 - VirtueSky/UniTask/Runtime/Progress.cs.meta | 11 - VirtueSky/UniTask/Runtime/TaskPool.cs | 123 - VirtueSky/UniTask/Runtime/TaskPool.cs.meta | 11 - .../UniTask/Runtime/TimeoutController.cs | 129 - .../UniTask/Runtime/TimeoutController.cs.meta | 11 - VirtueSky/UniTask/Runtime/TriggerEvent.cs | 291 - .../UniTask/Runtime/TriggerEvent.cs.meta | 11 - VirtueSky/UniTask/Runtime/Triggers.meta | 8 - .../Runtime/Triggers/AsyncAwakeTrigger.cs | 32 - .../Triggers/AsyncAwakeTrigger.cs.meta | 11 - .../Runtime/Triggers/AsyncDestroyTrigger.cs | 95 - .../Triggers/AsyncDestroyTrigger.cs.meta | 11 - .../Runtime/Triggers/AsyncStartTrigger.cs | 38 - .../Triggers/AsyncStartTrigger.cs.meta | 11 - .../Runtime/Triggers/AsyncTriggerBase.cs | 310 - .../Runtime/Triggers/AsyncTriggerBase.cs.meta | 11 - .../Triggers/AsyncTriggerExtensions.cs | 102 - .../Triggers/AsyncTriggerExtensions.cs.meta | 11 - .../Triggers/MonoBehaviourMessagesTriggers.cs | 4457 ------ .../MonoBehaviourMessagesTriggers.cs.meta | 11 - .../UniTask/Runtime/UniTask.AsValueTask.cs | 104 - .../Runtime/UniTask.AsValueTask.cs.meta | 11 - VirtueSky/UniTask/Runtime/UniTask.Bridge.cs | 18 - .../UniTask/Runtime/UniTask.Bridge.cs.meta | 11 - VirtueSky/UniTask/Runtime/UniTask.Delay.cs | 1104 -- .../UniTask/Runtime/UniTask.Delay.cs.meta | 11 - VirtueSky/UniTask/Runtime/UniTask.Factory.cs | 533 - .../UniTask/Runtime/UniTask.Factory.cs.meta | 11 - VirtueSky/UniTask/Runtime/UniTask.Run.cs | 289 - VirtueSky/UniTask/Runtime/UniTask.Run.cs.meta | 11 - .../UniTask/Runtime/UniTask.Threading.cs | 412 - .../UniTask/Runtime/UniTask.Threading.cs.meta | 11 - .../UniTask/Runtime/UniTask.WaitUntil.cs | 666 - .../UniTask/Runtime/UniTask.WaitUntil.cs.meta | 11 - .../Runtime/UniTask.WhenAll.Generated.cs | 5011 ------- .../Runtime/UniTask.WhenAll.Generated.cs.meta | 11 - VirtueSky/UniTask/Runtime/UniTask.WhenAll.cs | 237 - .../UniTask/Runtime/UniTask.WhenAll.cs.meta | 11 - .../Runtime/UniTask.WhenAny.Generated.cs | 5060 ------- .../Runtime/UniTask.WhenAny.Generated.cs.meta | 11 - VirtueSky/UniTask/Runtime/UniTask.WhenAny.cs | 359 - .../UniTask/Runtime/UniTask.WhenAny.cs.meta | 11 - VirtueSky/UniTask/Runtime/UniTask.cs | 711 - VirtueSky/UniTask/Runtime/UniTask.cs.meta | 11 - .../Runtime/UniTaskCompletionSource.cs | 944 -- .../Runtime/UniTaskCompletionSource.cs.meta | 11 - .../Runtime/UniTaskExtensions.Shorthand.cs | 187 - .../UniTaskExtensions.Shorthand.cs.meta | 11 - .../UniTask/Runtime/UniTaskExtensions.cs | 921 -- .../UniTask/Runtime/UniTaskExtensions.cs.meta | 11 - .../Runtime/UniTaskObservableExtensions.cs | 750 - .../UniTaskObservableExtensions.cs.meta | 11 - VirtueSky/UniTask/Runtime/UniTaskScheduler.cs | 103 - .../UniTask/Runtime/UniTaskScheduler.cs.meta | 11 - .../Runtime/UniTaskSynchronizationContext.cs | 158 - .../UniTaskSynchronizationContext.cs.meta | 11 - VirtueSky/UniTask/Runtime/UniTaskVoid.cs | 19 - VirtueSky/UniTask/Runtime/UniTaskVoid.cs.meta | 11 - ...cExtensions.AssetBundleRequestAllAssets.cs | 250 - ...nsions.AssetBundleRequestAllAssets.cs.meta | 11 - .../UnityAsyncExtensions.AsyncGPUReadback.cs | 160 - ...tyAsyncExtensions.AsyncGPUReadback.cs.meta | 11 - .../Runtime/UnityAsyncExtensions.Jobs.cs | 102 - .../Runtime/UnityAsyncExtensions.Jobs.cs.meta | 11 - .../UnityAsyncExtensions.MonoBehaviour.cs | 14 - ...UnityAsyncExtensions.MonoBehaviour.cs.meta | 11 - .../UniTask/Runtime/UnityAsyncExtensions.cs | 1196 -- .../Runtime/UnityAsyncExtensions.cs.meta | 11 - .../Runtime/UnityAsyncExtensions.uGUI.cs | 918 -- .../Runtime/UnityAsyncExtensions.uGUI.cs.meta | 11 - .../Runtime/UnityAwaitableExtensions.cs | 17 - .../Runtime/UnityAwaitableExtensions.cs.meta | 3 - .../UniTask/Runtime/UnityBindingExtensions.cs | 245 - .../Runtime/UnityBindingExtensions.cs.meta | 11 - .../Runtime/UnityWebRequestException.cs | 67 - .../Runtime/UnityWebRequestException.cs.meta | 11 - .../VirtueSky.Sunflower.UniTask.asmdef | 49 - .../VirtueSky.Sunflower.UniTask.asmdef.meta | 7 - .../UniTask/Runtime/_InternalVisibleTo.cs | 6 - .../Runtime/_InternalVisibleTo.cs.meta | 11 - 326 files changed, 7 insertions(+), 71536 deletions(-) delete mode 100644 VirtueSky/UniTask.meta delete mode 100644 VirtueSky/UniTask/Editor.meta delete mode 100644 VirtueSky/UniTask/Editor/SplitterGUILayout.cs delete mode 100644 VirtueSky/UniTask/Editor/SplitterGUILayout.cs.meta delete mode 100644 VirtueSky/UniTask/Editor/UniTaskTrackerTreeView.cs delete mode 100644 VirtueSky/UniTask/Editor/UniTaskTrackerTreeView.cs.meta delete mode 100644 VirtueSky/UniTask/Editor/UniTaskTrackerWindow.cs delete mode 100644 VirtueSky/UniTask/Editor/UniTaskTrackerWindow.cs.meta delete mode 100644 VirtueSky/UniTask/Editor/VirtueSky.Sunflower.UniTask.Editor.asmdef delete mode 100644 VirtueSky/UniTask/Editor/VirtueSky.Sunflower.UniTask.Editor.asmdef.meta delete mode 100644 VirtueSky/UniTask/Runtime.meta delete mode 100644 VirtueSky/UniTask/Runtime/AsyncLazy.cs delete mode 100644 VirtueSky/UniTask/Runtime/AsyncLazy.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/AsyncReactiveProperty.cs delete mode 100644 VirtueSky/UniTask/Runtime/AsyncReactiveProperty.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/AsyncUnit.cs delete mode 100644 VirtueSky/UniTask/Runtime/AsyncUnit.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/CancellationTokenEqualityComparer.cs delete mode 100644 VirtueSky/UniTask/Runtime/CancellationTokenEqualityComparer.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/CancellationTokenExtensions.cs delete mode 100644 VirtueSky/UniTask/Runtime/CancellationTokenExtensions.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/CancellationTokenSourceExtensions.cs delete mode 100644 VirtueSky/UniTask/Runtime/CancellationTokenSourceExtensions.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Channel.cs delete mode 100644 VirtueSky/UniTask/Runtime/Channel.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/CompilerServices.meta delete mode 100644 VirtueSky/UniTask/Runtime/CompilerServices/AsyncMethodBuilderAttribute.cs delete mode 100644 VirtueSky/UniTask/Runtime/CompilerServices/AsyncMethodBuilderAttribute.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/CompilerServices/AsyncUniTaskMethodBuilder.cs delete mode 100644 VirtueSky/UniTask/Runtime/CompilerServices/AsyncUniTaskMethodBuilder.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/CompilerServices/AsyncUniTaskVoidMethodBuilder.cs delete mode 100644 VirtueSky/UniTask/Runtime/CompilerServices/AsyncUniTaskVoidMethodBuilder.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/CompilerServices/StateMachineRunner.cs delete mode 100644 VirtueSky/UniTask/Runtime/CompilerServices/StateMachineRunner.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/EnumerableAsyncExtensions.cs delete mode 100644 VirtueSky/UniTask/Runtime/EnumerableAsyncExtensions.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/EnumeratorAsyncExtensions.cs delete mode 100644 VirtueSky/UniTask/Runtime/EnumeratorAsyncExtensions.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/ExceptionExtensions.cs delete mode 100644 VirtueSky/UniTask/Runtime/ExceptionExtensions.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/External.meta delete mode 100644 VirtueSky/UniTask/Runtime/External/Addressables.meta delete mode 100644 VirtueSky/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs delete mode 100644 VirtueSky/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/External/DOTween.meta delete mode 100644 VirtueSky/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs delete mode 100644 VirtueSky/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/External/TextMeshPro.meta delete mode 100644 VirtueSky/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.InputField.cs delete mode 100644 VirtueSky/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.InputField.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.cs delete mode 100644 VirtueSky/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/IUniTaskAsyncEnumerable.cs delete mode 100644 VirtueSky/UniTask/Runtime/IUniTaskAsyncEnumerable.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/IUniTaskSource.cs delete mode 100644 VirtueSky/UniTask/Runtime/IUniTaskSource.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Internal.meta delete mode 100644 VirtueSky/UniTask/Runtime/Internal/ArrayPool.cs delete mode 100644 VirtueSky/UniTask/Runtime/Internal/ArrayPool.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Internal/ArrayPoolUtil.cs delete mode 100644 VirtueSky/UniTask/Runtime/Internal/ArrayPoolUtil.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Internal/ArrayUtil.cs delete mode 100644 VirtueSky/UniTask/Runtime/Internal/ArrayUtil.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Internal/ContinuationQueue.cs delete mode 100644 VirtueSky/UniTask/Runtime/Internal/ContinuationQueue.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Internal/DiagnosticsExtensions.cs delete mode 100644 VirtueSky/UniTask/Runtime/Internal/DiagnosticsExtensions.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Internal/Error.cs delete mode 100644 VirtueSky/UniTask/Runtime/Internal/Error.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Internal/MinimumQueue.cs delete mode 100644 VirtueSky/UniTask/Runtime/Internal/MinimumQueue.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Internal/PlayerLoopRunner.cs delete mode 100644 VirtueSky/UniTask/Runtime/Internal/PlayerLoopRunner.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Internal/PooledDelegate.cs delete mode 100644 VirtueSky/UniTask/Runtime/Internal/PooledDelegate.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Internal/RuntimeHelpersAbstraction.cs delete mode 100644 VirtueSky/UniTask/Runtime/Internal/RuntimeHelpersAbstraction.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Internal/StatePool.cs delete mode 100644 VirtueSky/UniTask/Runtime/Internal/StatePool.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Internal/TaskTracker.cs delete mode 100644 VirtueSky/UniTask/Runtime/Internal/TaskTracker.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Internal/UnityEqualityComparer.cs delete mode 100644 VirtueSky/UniTask/Runtime/Internal/UnityEqualityComparer.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Internal/UnityWebRequestExtensions.cs delete mode 100644 VirtueSky/UniTask/Runtime/Internal/UnityWebRequestExtensions.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Internal/ValueStopwatch.cs delete mode 100644 VirtueSky/UniTask/Runtime/Internal/ValueStopwatch.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Internal/WeakDictionary.cs delete mode 100644 VirtueSky/UniTask/Runtime/Internal/WeakDictionary.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Aggregate.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Aggregate.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/All.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/All.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Any.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Any.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/AppendPrepend.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/AppendPrepend.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/AsUniTaskAsyncEnumerable.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/AsUniTaskAsyncEnumerable.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/AsyncEnumeratorBase.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/AsyncEnumeratorBase.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Average.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Average.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Buffer.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Buffer.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Cast.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Cast.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/CombineLatest.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/CombineLatest.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Concat.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Concat.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Contains.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Contains.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Count.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Count.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Create.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Create.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/DefaultIfEmpty.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/DefaultIfEmpty.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Distinct.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Distinct.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/DistinctUntilChanged.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/DistinctUntilChanged.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Do.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Do.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/ElementAt.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/ElementAt.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Empty.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Empty.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Except.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Except.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/First.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/First.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/ForEach.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/ForEach.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/GroupBy.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/GroupBy.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/GroupJoin.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/GroupJoin.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Intersect.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Intersect.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Join.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Join.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Last.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Last.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/LongCount.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/LongCount.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Max.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Max.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Merge.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Merge.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Min.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Min.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/MinMax.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/MinMax.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Never.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Never.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/OfType.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/OfType.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/OrderBy.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/OrderBy.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Pairwise.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Pairwise.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Publish.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Publish.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Queue.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Queue.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Range.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Range.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Repeat.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Repeat.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Return.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Return.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Reverse.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Reverse.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Select.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Select.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/SelectMany.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/SelectMany.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/SequenceEqual.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/SequenceEqual.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Single.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Single.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Skip.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Skip.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/SkipLast.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/SkipLast.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/SkipUntil.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/SkipUntil.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/SkipUntilCanceled.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/SkipUntilCanceled.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/SkipWhile.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/SkipWhile.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Subscribe.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Subscribe.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Sum.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Sum.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Take.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Take.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/TakeLast.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/TakeLast.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/TakeUntil.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/TakeUntil.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/TakeUntilCanceled.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/TakeUntilCanceled.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/TakeWhile.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/TakeWhile.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Throw.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Throw.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/ToArray.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/ToArray.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/ToDictionary.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/ToDictionary.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/ToHashSet.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/ToHashSet.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/ToList.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/ToList.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/ToLookup.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/ToLookup.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/ToObservable.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/ToObservable.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/ToUniTaskAsyncEnumerable.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/ToUniTaskAsyncEnumerable.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Union.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Union.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/UnityExtensions.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/UnityExtensions/EveryUpdate.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/UnityExtensions/EveryUpdate.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/UnityExtensions/EveryValueChanged.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/UnityExtensions/EveryValueChanged.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/UnityExtensions/Timer.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/UnityExtensions/Timer.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Where.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Where.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Zip.cs delete mode 100644 VirtueSky/UniTask/Runtime/Linq/Zip.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/MoveNextSource.cs delete mode 100644 VirtueSky/UniTask/Runtime/MoveNextSource.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/PlayerLoopHelper.cs delete mode 100644 VirtueSky/UniTask/Runtime/PlayerLoopHelper.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/PlayerLoopTimer.cs delete mode 100644 VirtueSky/UniTask/Runtime/PlayerLoopTimer.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Progress.cs delete mode 100644 VirtueSky/UniTask/Runtime/Progress.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/TaskPool.cs delete mode 100644 VirtueSky/UniTask/Runtime/TaskPool.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/TimeoutController.cs delete mode 100644 VirtueSky/UniTask/Runtime/TimeoutController.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/TriggerEvent.cs delete mode 100644 VirtueSky/UniTask/Runtime/TriggerEvent.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Triggers.meta delete mode 100644 VirtueSky/UniTask/Runtime/Triggers/AsyncAwakeTrigger.cs delete mode 100644 VirtueSky/UniTask/Runtime/Triggers/AsyncAwakeTrigger.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Triggers/AsyncDestroyTrigger.cs delete mode 100644 VirtueSky/UniTask/Runtime/Triggers/AsyncDestroyTrigger.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Triggers/AsyncStartTrigger.cs delete mode 100644 VirtueSky/UniTask/Runtime/Triggers/AsyncStartTrigger.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Triggers/AsyncTriggerBase.cs delete mode 100644 VirtueSky/UniTask/Runtime/Triggers/AsyncTriggerBase.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Triggers/AsyncTriggerExtensions.cs delete mode 100644 VirtueSky/UniTask/Runtime/Triggers/AsyncTriggerExtensions.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/Triggers/MonoBehaviourMessagesTriggers.cs delete mode 100644 VirtueSky/UniTask/Runtime/Triggers/MonoBehaviourMessagesTriggers.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.AsValueTask.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.AsValueTask.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.Bridge.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.Bridge.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.Delay.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.Delay.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.Factory.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.Factory.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.Run.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.Run.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.Threading.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.Threading.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.WaitUntil.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.WaitUntil.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.WhenAll.Generated.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.WhenAll.Generated.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.WhenAll.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.WhenAll.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.WhenAny.Generated.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.WhenAny.Generated.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.WhenAny.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.WhenAny.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTask.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTaskCompletionSource.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTaskCompletionSource.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTaskExtensions.Shorthand.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTaskExtensions.Shorthand.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTaskExtensions.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTaskExtensions.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTaskObservableExtensions.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTaskObservableExtensions.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTaskScheduler.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTaskScheduler.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTaskSynchronizationContext.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTaskSynchronizationContext.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UniTaskVoid.cs delete mode 100644 VirtueSky/UniTask/Runtime/UniTaskVoid.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs delete mode 100644 VirtueSky/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs delete mode 100644 VirtueSky/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UnityAsyncExtensions.Jobs.cs delete mode 100644 VirtueSky/UniTask/Runtime/UnityAsyncExtensions.Jobs.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UnityAsyncExtensions.MonoBehaviour.cs delete mode 100644 VirtueSky/UniTask/Runtime/UnityAsyncExtensions.MonoBehaviour.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UnityAsyncExtensions.cs delete mode 100644 VirtueSky/UniTask/Runtime/UnityAsyncExtensions.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UnityAsyncExtensions.uGUI.cs delete mode 100644 VirtueSky/UniTask/Runtime/UnityAsyncExtensions.uGUI.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UnityAwaitableExtensions.cs delete mode 100644 VirtueSky/UniTask/Runtime/UnityAwaitableExtensions.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UnityBindingExtensions.cs delete mode 100644 VirtueSky/UniTask/Runtime/UnityBindingExtensions.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/UnityWebRequestException.cs delete mode 100644 VirtueSky/UniTask/Runtime/UnityWebRequestException.cs.meta delete mode 100644 VirtueSky/UniTask/Runtime/VirtueSky.Sunflower.UniTask.asmdef delete mode 100644 VirtueSky/UniTask/Runtime/VirtueSky.Sunflower.UniTask.asmdef.meta delete mode 100644 VirtueSky/UniTask/Runtime/_InternalVisibleTo.cs delete mode 100644 VirtueSky/UniTask/Runtime/_InternalVisibleTo.cs.meta diff --git a/VirtueSky/ControlPanel/CPRegisterPackageDrawer.cs b/VirtueSky/ControlPanel/CPRegisterPackageDrawer.cs index 3a54ca91..bbbf7e82 100644 --- a/VirtueSky/ControlPanel/CPRegisterPackageDrawer.cs +++ b/VirtueSky/ControlPanel/CPRegisterPackageDrawer.cs @@ -92,6 +92,8 @@ static void DrawButtonAddSomePackage() ConstantPackage.PackageNameSpineCsharp, ConstantPackage.MaxVersionSpineCsharp); CPUtility.DrawButtonInstallPackage("Install Spine Unity", "Remove Spine Unity", ConstantPackage.PackageNameSpineUnity, ConstantPackage.MaxVersionSpineUnity); + CPUtility.DrawButtonInstallPackage("Install UniTask", "Remove UniTask", ConstantPackage.PackageNameUniTask, + ConstantPackage.MaxVersionUniTask); CPUtility.DrawButtonInstallPackage("Install Apple Sign In", "Remove Apple Sign In", ConstantPackage.PackageNameAppleSignIn, ConstantPackage.MaxVersionAppleSignIn); // CPUtility.DrawButtonInstallPackage("Install Animancer", "Remove Animancer", diff --git a/VirtueSky/ControlPanel/ConstantPackage.cs b/VirtueSky/ControlPanel/ConstantPackage.cs index de583762..f21a72eb 100644 --- a/VirtueSky/ControlPanel/ConstantPackage.cs +++ b/VirtueSky/ControlPanel/ConstantPackage.cs @@ -129,5 +129,10 @@ public class ConstantPackage "https://github.com/EsotericSoftware/spine-runtimes.git?path=spine-unity/Assets/Spine#4.1"; #endregion + + public const string PackageNameUniTask = "com.cysharp.unitask"; + + public const string MaxVersionUniTask = + "https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask#2.5.5"; } } \ No newline at end of file diff --git a/VirtueSky/UniTask.meta b/VirtueSky/UniTask.meta deleted file mode 100644 index 4e64c312..00000000 --- a/VirtueSky/UniTask.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: fed91146c0787b74fa554276fafe8a6f -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Editor.meta b/VirtueSky/UniTask/Editor.meta deleted file mode 100644 index bba9a841..00000000 --- a/VirtueSky/UniTask/Editor.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: d10af0f57469d6b4d9e616f9cbda508e -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Editor/SplitterGUILayout.cs b/VirtueSky/UniTask/Editor/SplitterGUILayout.cs deleted file mode 100644 index 24ee7de8..00000000 --- a/VirtueSky/UniTask/Editor/SplitterGUILayout.cs +++ /dev/null @@ -1,62 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Linq; -using System.Reflection; -using UnityEditor; -using UnityEngine; - -namespace VirtueSky.Threading.Tasks.Editor -{ - // reflection call of UnityEditor.SplitterGUILayout - internal static class SplitterGUILayout - { - static BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static; - - static Lazy splitterStateType = new Lazy(() => - { - var type = typeof(EditorWindow).Assembly.GetTypes().First(x => x.FullName == "UnityEditor.SplitterState"); - return type; - }); - - static Lazy splitterStateCtor = new Lazy(() => - { - var type = splitterStateType.Value; - return type.GetConstructor(flags, null, new Type[] { typeof(float[]), typeof(int[]), typeof(int[]) }, null); - }); - - static Lazy splitterGUILayoutType = new Lazy(() => - { - var type = typeof(EditorWindow).Assembly.GetTypes().First(x => x.FullName == "UnityEditor.SplitterGUILayout"); - return type; - }); - - static Lazy beginVerticalSplit = new Lazy(() => - { - var type = splitterGUILayoutType.Value; - return type.GetMethod("BeginVerticalSplit", flags, null, new Type[] { splitterStateType.Value, typeof(GUILayoutOption[]) }, null); - }); - - static Lazy endVerticalSplit = new Lazy(() => - { - var type = splitterGUILayoutType.Value; - return type.GetMethod("EndVerticalSplit", flags, null, Type.EmptyTypes, null); - }); - - public static object CreateSplitterState(float[] relativeSizes, int[] minSizes, int[] maxSizes) - { - return splitterStateCtor.Value.Invoke(new object[] { relativeSizes, minSizes, maxSizes }); - } - - public static void BeginVerticalSplit(object splitterState, params GUILayoutOption[] options) - { - beginVerticalSplit.Value.Invoke(null, new object[] { splitterState, options }); - } - - public static void EndVerticalSplit() - { - endVerticalSplit.Value.Invoke(null, Type.EmptyTypes); - } - } -} - diff --git a/VirtueSky/UniTask/Editor/SplitterGUILayout.cs.meta b/VirtueSky/UniTask/Editor/SplitterGUILayout.cs.meta deleted file mode 100644 index 4d718f4e..00000000 --- a/VirtueSky/UniTask/Editor/SplitterGUILayout.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 40ef2e46f900131419e869398a8d3c9d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Editor/UniTaskTrackerTreeView.cs b/VirtueSky/UniTask/Editor/UniTaskTrackerTreeView.cs deleted file mode 100644 index 82d02311..00000000 --- a/VirtueSky/UniTask/Editor/UniTaskTrackerTreeView.cs +++ /dev/null @@ -1,182 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using UnityEngine; -using UnityEditor; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System; -using UnityEditor.IMGUI.Controls; -using VirtueSky.Threading.Tasks.Internal; -using System.Text; -using System.Text.RegularExpressions; - -namespace VirtueSky.Threading.Tasks.Editor -{ - public class UniTaskTrackerViewItem : TreeViewItem - { - static Regex removeHref = new Regex("(.+)", RegexOptions.Compiled); - - public string TaskType { get; set; } - public string Elapsed { get; set; } - public string Status { get; set; } - - string position; - public string Position - { - get { return position; } - set - { - position = value; - PositionFirstLine = GetFirstLine(position); - } - } - - public string PositionFirstLine { get; private set; } - - static string GetFirstLine(string str) - { - var sb = new StringBuilder(); - for (int i = 0; i < str.Length; i++) - { - if (str[i] == '\r' || str[i] == '\n') - { - break; - } - sb.Append(str[i]); - } - - return removeHref.Replace(sb.ToString(), "$1"); - } - - public UniTaskTrackerViewItem(int id) : base(id) - { - - } - } - - public class UniTaskTrackerTreeView : TreeView - { - const string sortedColumnIndexStateKey = "UniTaskTrackerTreeView_sortedColumnIndex"; - - public IReadOnlyList CurrentBindingItems; - - public UniTaskTrackerTreeView() - : this(new TreeViewState(), new MultiColumnHeader(new MultiColumnHeaderState(new[] - { - new MultiColumnHeaderState.Column() { headerContent = new GUIContent("TaskType"), width = 20}, - new MultiColumnHeaderState.Column() { headerContent = new GUIContent("Elapsed"), width = 10}, - new MultiColumnHeaderState.Column() { headerContent = new GUIContent("Status"), width = 10}, - new MultiColumnHeaderState.Column() { headerContent = new GUIContent("Position")}, - }))) - { - } - - UniTaskTrackerTreeView(TreeViewState state, MultiColumnHeader header) - : base(state, header) - { - rowHeight = 20; - showAlternatingRowBackgrounds = true; - showBorder = true; - header.sortingChanged += Header_sortingChanged; - - header.ResizeToFit(); - Reload(); - - header.sortedColumnIndex = SessionState.GetInt(sortedColumnIndexStateKey, 1); - } - - public void ReloadAndSort() - { - var currentSelected = this.state.selectedIDs; - Reload(); - Header_sortingChanged(this.multiColumnHeader); - this.state.selectedIDs = currentSelected; - } - - private void Header_sortingChanged(MultiColumnHeader multiColumnHeader) - { - SessionState.SetInt(sortedColumnIndexStateKey, multiColumnHeader.sortedColumnIndex); - var index = multiColumnHeader.sortedColumnIndex; - var ascending = multiColumnHeader.IsSortedAscending(multiColumnHeader.sortedColumnIndex); - - var items = rootItem.children.Cast(); - - IOrderedEnumerable orderedEnumerable; - switch (index) - { - case 0: - orderedEnumerable = ascending ? items.OrderBy(item => item.TaskType) : items.OrderByDescending(item => item.TaskType); - break; - case 1: - orderedEnumerable = ascending ? items.OrderBy(item => double.Parse(item.Elapsed)) : items.OrderByDescending(item => double.Parse(item.Elapsed)); - break; - case 2: - orderedEnumerable = ascending ? items.OrderBy(item => item.Status) : items.OrderByDescending(item => item.Elapsed); - break; - case 3: - orderedEnumerable = ascending ? items.OrderBy(item => item.Position) : items.OrderByDescending(item => item.PositionFirstLine); - break; - default: - throw new ArgumentOutOfRangeException(nameof(index), index, null); - } - - CurrentBindingItems = rootItem.children = orderedEnumerable.Cast().ToList(); - BuildRows(rootItem); - } - - protected override TreeViewItem BuildRoot() - { - var root = new TreeViewItem { depth = -1 }; - - var children = new List(); - - TaskTracker.ForEachActiveTask((trackingId, awaiterType, status, created, stackTrace) => - { - children.Add(new UniTaskTrackerViewItem(trackingId) { TaskType = awaiterType, Status = status.ToString(), Elapsed = (DateTime.UtcNow - created).TotalSeconds.ToString("00.00"), Position = stackTrace }); - }); - - CurrentBindingItems = children; - root.children = CurrentBindingItems as List; - return root; - } - - protected override bool CanMultiSelect(TreeViewItem item) - { - return false; - } - - protected override void RowGUI(RowGUIArgs args) - { - var item = args.item as UniTaskTrackerViewItem; - - for (var visibleColumnIndex = 0; visibleColumnIndex < args.GetNumVisibleColumns(); visibleColumnIndex++) - { - var rect = args.GetCellRect(visibleColumnIndex); - var columnIndex = args.GetColumn(visibleColumnIndex); - - var labelStyle = args.selected ? EditorStyles.whiteLabel : EditorStyles.label; - labelStyle.alignment = TextAnchor.MiddleLeft; - switch (columnIndex) - { - case 0: - EditorGUI.LabelField(rect, item.TaskType, labelStyle); - break; - case 1: - EditorGUI.LabelField(rect, item.Elapsed, labelStyle); - break; - case 2: - EditorGUI.LabelField(rect, item.Status, labelStyle); - break; - case 3: - EditorGUI.LabelField(rect, item.PositionFirstLine, labelStyle); - break; - default: - throw new ArgumentOutOfRangeException(nameof(columnIndex), columnIndex, null); - } - } - } - } - -} - diff --git a/VirtueSky/UniTask/Editor/UniTaskTrackerTreeView.cs.meta b/VirtueSky/UniTask/Editor/UniTaskTrackerTreeView.cs.meta deleted file mode 100644 index 9b34d7b9..00000000 --- a/VirtueSky/UniTask/Editor/UniTaskTrackerTreeView.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 52e2d973a2156674e8c1c9433ed031f7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Editor/UniTaskTrackerWindow.cs b/VirtueSky/UniTask/Editor/UniTaskTrackerWindow.cs deleted file mode 100644 index 9590edd6..00000000 --- a/VirtueSky/UniTask/Editor/UniTaskTrackerWindow.cs +++ /dev/null @@ -1,209 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using UnityEngine; -using UnityEditor; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System; -using UnityEditor.IMGUI.Controls; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks.Editor -{ - public class UniTaskTrackerWindow : EditorWindow - { - static int interval; - - static UniTaskTrackerWindow window; - - [MenuItem("Window/UniTask Tracker")] - public static void OpenWindow() - { - if (window != null) - { - window.Close(); - } - - // will called OnEnable(singleton instance will be set). - GetWindow("UniTask Tracker").Show(); - } - - static readonly GUILayoutOption[] EmptyLayoutOption = new GUILayoutOption[0]; - - UniTaskTrackerTreeView treeView; - object splitterState; - - void OnEnable() - { - window = this; // set singleton. - splitterState = SplitterGUILayout.CreateSplitterState(new float[] { 75f, 25f }, new int[] { 32, 32 }, null); - treeView = new UniTaskTrackerTreeView(); - TaskTracker.EditorEnableState.EnableAutoReload = EditorPrefs.GetBool(TaskTracker.EnableAutoReloadKey, false); - TaskTracker.EditorEnableState.EnableTracking = EditorPrefs.GetBool(TaskTracker.EnableTrackingKey, false); - TaskTracker.EditorEnableState.EnableStackTrace = EditorPrefs.GetBool(TaskTracker.EnableStackTraceKey, false); - } - - void OnGUI() - { - // Head - RenderHeadPanel(); - - // Splittable - SplitterGUILayout.BeginVerticalSplit(this.splitterState, EmptyLayoutOption); - { - // Column Tabble - RenderTable(); - - // StackTrace details - RenderDetailsPanel(); - } - SplitterGUILayout.EndVerticalSplit(); - } - - #region HeadPanel - - public static bool EnableAutoReload => TaskTracker.EditorEnableState.EnableAutoReload; - public static bool EnableTracking => TaskTracker.EditorEnableState.EnableTracking; - public static bool EnableStackTrace => TaskTracker.EditorEnableState.EnableStackTrace; - static readonly GUIContent EnableAutoReloadHeadContent = EditorGUIUtility.TrTextContent("Enable AutoReload", "Reload automatically.", (Texture)null); - static readonly GUIContent ReloadHeadContent = EditorGUIUtility.TrTextContent("Reload", "Reload View.", (Texture)null); - static readonly GUIContent GCHeadContent = EditorGUIUtility.TrTextContent("GC.Collect", "Invoke GC.Collect.", (Texture)null); - static readonly GUIContent EnableTrackingHeadContent = EditorGUIUtility.TrTextContent("Enable Tracking", "Start to track async/await UniTask. Performance impact: low", (Texture)null); - static readonly GUIContent EnableStackTraceHeadContent = EditorGUIUtility.TrTextContent("Enable StackTrace", "Capture StackTrace when task is started. Performance impact: high", (Texture)null); - - // [Enable Tracking] | [Enable StackTrace] - void RenderHeadPanel() - { - EditorGUILayout.BeginVertical(EmptyLayoutOption); - EditorGUILayout.BeginHorizontal(EditorStyles.toolbar, EmptyLayoutOption); - - if (GUILayout.Toggle(EnableAutoReload, EnableAutoReloadHeadContent, EditorStyles.toolbarButton, EmptyLayoutOption) != EnableAutoReload) - { - TaskTracker.EditorEnableState.EnableAutoReload = !EnableAutoReload; - } - - if (GUILayout.Toggle(EnableTracking, EnableTrackingHeadContent, EditorStyles.toolbarButton, EmptyLayoutOption) != EnableTracking) - { - TaskTracker.EditorEnableState.EnableTracking = !EnableTracking; - } - - if (GUILayout.Toggle(EnableStackTrace, EnableStackTraceHeadContent, EditorStyles.toolbarButton, EmptyLayoutOption) != EnableStackTrace) - { - TaskTracker.EditorEnableState.EnableStackTrace = !EnableStackTrace; - } - - GUILayout.FlexibleSpace(); - - if (GUILayout.Button(ReloadHeadContent, EditorStyles.toolbarButton, EmptyLayoutOption)) - { - TaskTracker.CheckAndResetDirty(); - treeView.ReloadAndSort(); - Repaint(); - } - - if (GUILayout.Button(GCHeadContent, EditorStyles.toolbarButton, EmptyLayoutOption)) - { - GC.Collect(0); - } - - EditorGUILayout.EndHorizontal(); - EditorGUILayout.EndVertical(); - } - - #endregion - - #region TableColumn - - Vector2 tableScroll; - GUIStyle tableListStyle; - - void RenderTable() - { - if (tableListStyle == null) - { - tableListStyle = new GUIStyle("CN Box"); - tableListStyle.margin.top = 0; - tableListStyle.padding.left = 3; - } - - EditorGUILayout.BeginVertical(tableListStyle, EmptyLayoutOption); - - this.tableScroll = EditorGUILayout.BeginScrollView(this.tableScroll, new GUILayoutOption[] - { - GUILayout.ExpandWidth(true), - GUILayout.MaxWidth(2000f) - }); - var controlRect = EditorGUILayout.GetControlRect(new GUILayoutOption[] - { - GUILayout.ExpandHeight(true), - GUILayout.ExpandWidth(true) - }); - - - treeView?.OnGUI(controlRect); - - EditorGUILayout.EndScrollView(); - EditorGUILayout.EndVertical(); - } - - private void Update() - { - if (EnableAutoReload) - { - if (interval++ % 120 == 0) - { - if (TaskTracker.CheckAndResetDirty()) - { - treeView.ReloadAndSort(); - Repaint(); - } - } - } - } - - #endregion - - #region Details - - static GUIStyle detailsStyle; - Vector2 detailsScroll; - - void RenderDetailsPanel() - { - if (detailsStyle == null) - { - detailsStyle = new GUIStyle("CN Message"); - detailsStyle.wordWrap = false; - detailsStyle.stretchHeight = true; - detailsStyle.margin.right = 15; - } - - string message = ""; - var selected = treeView.state.selectedIDs; - if (selected.Count > 0) - { - var first = selected[0]; - var item = treeView.CurrentBindingItems.FirstOrDefault(x => x.id == first) as UniTaskTrackerViewItem; - if (item != null) - { - message = item.Position; - } - } - - detailsScroll = EditorGUILayout.BeginScrollView(this.detailsScroll, EmptyLayoutOption); - var vector = detailsStyle.CalcSize(new GUIContent(message)); - EditorGUILayout.SelectableLabel(message, detailsStyle, new GUILayoutOption[] - { - GUILayout.ExpandHeight(true), - GUILayout.ExpandWidth(true), - GUILayout.MinWidth(vector.x), - GUILayout.MinHeight(vector.y) - }); - EditorGUILayout.EndScrollView(); - } - - #endregion - } -} - diff --git a/VirtueSky/UniTask/Editor/UniTaskTrackerWindow.cs.meta b/VirtueSky/UniTask/Editor/UniTaskTrackerWindow.cs.meta deleted file mode 100644 index ba1b7045..00000000 --- a/VirtueSky/UniTask/Editor/UniTaskTrackerWindow.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5bee3e3860e37484aa3b861bf76d129f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Editor/VirtueSky.Sunflower.UniTask.Editor.asmdef b/VirtueSky/UniTask/Editor/VirtueSky.Sunflower.UniTask.Editor.asmdef deleted file mode 100644 index 4b5b2bfa..00000000 --- a/VirtueSky/UniTask/Editor/VirtueSky.Sunflower.UniTask.Editor.asmdef +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "VirtueSky.Sunflower.UniTask.Editor", - "rootNamespace": "", - "references": [ - "VirtueSky.Sunflower.UniTask" - ], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": false, - "defineConstraints": [], - "versionDefines": [], - "noEngineReferences": false -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Editor/VirtueSky.Sunflower.UniTask.Editor.asmdef.meta b/VirtueSky/UniTask/Editor/VirtueSky.Sunflower.UniTask.Editor.asmdef.meta deleted file mode 100644 index 821b87b7..00000000 --- a/VirtueSky/UniTask/Editor/VirtueSky.Sunflower.UniTask.Editor.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 4129704b5a1a13841ba16f230bf24a57 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime.meta b/VirtueSky/UniTask/Runtime.meta deleted file mode 100644 index 7ad8aaac..00000000 --- a/VirtueSky/UniTask/Runtime.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: f173682b573f3a04889dd488d8969edb -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/AsyncLazy.cs b/VirtueSky/UniTask/Runtime/AsyncLazy.cs deleted file mode 100644 index 053439d0..00000000 --- a/VirtueSky/UniTask/Runtime/AsyncLazy.cs +++ /dev/null @@ -1,245 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks -{ - public class AsyncLazy - { - static Action continuation = SetCompletionSource; - - Func taskFactory; - UniTaskCompletionSource completionSource; - UniTask.Awaiter awaiter; - - object syncLock; - bool initialized; - - public AsyncLazy(Func taskFactory) - { - this.taskFactory = taskFactory; - this.completionSource = new UniTaskCompletionSource(); - this.syncLock = new object(); - this.initialized = false; - } - - internal AsyncLazy(UniTask task) - { - this.taskFactory = null; - this.completionSource = new UniTaskCompletionSource(); - this.syncLock = null; - this.initialized = true; - - var awaiter = task.GetAwaiter(); - if (awaiter.IsCompleted) - { - SetCompletionSource(awaiter); - } - else - { - this.awaiter = awaiter; - awaiter.SourceOnCompleted(continuation, this); - } - } - - public UniTask Task - { - get - { - EnsureInitialized(); - return completionSource.Task; - } - } - - - public UniTask.Awaiter GetAwaiter() => Task.GetAwaiter(); - - void EnsureInitialized() - { - if (Volatile.Read(ref initialized)) - { - return; - } - - EnsureInitializedCore(); - } - - void EnsureInitializedCore() - { - lock (syncLock) - { - if (!Volatile.Read(ref initialized)) - { - var f = Interlocked.Exchange(ref taskFactory, null); - if (f != null) - { - var task = f(); - var awaiter = task.GetAwaiter(); - if (awaiter.IsCompleted) - { - SetCompletionSource(awaiter); - } - else - { - this.awaiter = awaiter; - awaiter.SourceOnCompleted(continuation, this); - } - - Volatile.Write(ref initialized, true); - } - } - } - } - - void SetCompletionSource(in UniTask.Awaiter awaiter) - { - try - { - awaiter.GetResult(); - completionSource.TrySetResult(); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - } - - static void SetCompletionSource(object state) - { - var self = (AsyncLazy)state; - try - { - self.awaiter.GetResult(); - self.completionSource.TrySetResult(); - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - } - finally - { - self.awaiter = default; - } - } - } - - public class AsyncLazy - { - static Action continuation = SetCompletionSource; - - Func> taskFactory; - UniTaskCompletionSource completionSource; - UniTask.Awaiter awaiter; - - object syncLock; - bool initialized; - - public AsyncLazy(Func> taskFactory) - { - this.taskFactory = taskFactory; - this.completionSource = new UniTaskCompletionSource(); - this.syncLock = new object(); - this.initialized = false; - } - - internal AsyncLazy(UniTask task) - { - this.taskFactory = null; - this.completionSource = new UniTaskCompletionSource(); - this.syncLock = null; - this.initialized = true; - - var awaiter = task.GetAwaiter(); - if (awaiter.IsCompleted) - { - SetCompletionSource(awaiter); - } - else - { - this.awaiter = awaiter; - awaiter.SourceOnCompleted(continuation, this); - } - } - - public UniTask Task - { - get - { - EnsureInitialized(); - return completionSource.Task; - } - } - - - public UniTask.Awaiter GetAwaiter() => Task.GetAwaiter(); - - void EnsureInitialized() - { - if (Volatile.Read(ref initialized)) - { - return; - } - - EnsureInitializedCore(); - } - - void EnsureInitializedCore() - { - lock (syncLock) - { - if (!Volatile.Read(ref initialized)) - { - var f = Interlocked.Exchange(ref taskFactory, null); - if (f != null) - { - var task = f(); - var awaiter = task.GetAwaiter(); - if (awaiter.IsCompleted) - { - SetCompletionSource(awaiter); - } - else - { - this.awaiter = awaiter; - awaiter.SourceOnCompleted(continuation, this); - } - - Volatile.Write(ref initialized, true); - } - } - } - } - - void SetCompletionSource(in UniTask.Awaiter awaiter) - { - try - { - var result = awaiter.GetResult(); - completionSource.TrySetResult(result); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - } - - static void SetCompletionSource(object state) - { - var self = (AsyncLazy)state; - try - { - var result = self.awaiter.GetResult(); - self.completionSource.TrySetResult(result); - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - } - finally - { - self.awaiter = default; - } - } - } -} diff --git a/VirtueSky/UniTask/Runtime/AsyncLazy.cs.meta b/VirtueSky/UniTask/Runtime/AsyncLazy.cs.meta deleted file mode 100644 index 554d1628..00000000 --- a/VirtueSky/UniTask/Runtime/AsyncLazy.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 01d1404ca421466419a7db7340ff5e77 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/AsyncReactiveProperty.cs b/VirtueSky/UniTask/Runtime/AsyncReactiveProperty.cs deleted file mode 100644 index 054f372a..00000000 --- a/VirtueSky/UniTask/Runtime/AsyncReactiveProperty.cs +++ /dev/null @@ -1,644 +0,0 @@ -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks -{ - public interface IReadOnlyAsyncReactiveProperty : IUniTaskAsyncEnumerable - { - T Value { get; } - IUniTaskAsyncEnumerable WithoutCurrent(); - UniTask WaitAsync(CancellationToken cancellationToken = default); - } - - public interface IAsyncReactiveProperty : IReadOnlyAsyncReactiveProperty - { - new T Value { get; set; } - } - - [Serializable] - public class AsyncReactiveProperty : IAsyncReactiveProperty, IDisposable - { - TriggerEvent triggerEvent; - -#if UNITY_2018_3_OR_NEWER - [UnityEngine.SerializeField] -#endif - T latestValue; - - public T Value - { - get - { - return latestValue; - } - set - { - this.latestValue = value; - triggerEvent.SetResult(value); - } - } - - public AsyncReactiveProperty(T value) - { - this.latestValue = value; - this.triggerEvent = default; - } - - public IUniTaskAsyncEnumerable WithoutCurrent() - { - return new WithoutCurrentEnumerable(this); - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken) - { - return new Enumerator(this, cancellationToken, true); - } - - public void Dispose() - { - triggerEvent.SetCompleted(); - } - - public static implicit operator T(AsyncReactiveProperty value) - { - return value.Value; - } - - public override string ToString() - { - if (isValueType) return latestValue.ToString(); - return latestValue?.ToString(); - } - - public UniTask WaitAsync(CancellationToken cancellationToken = default) - { - return new UniTask(WaitAsyncSource.Create(this, cancellationToken, out var token), token); - } - - static bool isValueType; - - static AsyncReactiveProperty() - { - isValueType = typeof(T).IsValueType; - } - - sealed class WaitAsyncSource : IUniTaskSource, ITriggerHandler, ITaskPoolNode - { - static Action cancellationCallback = CancellationCallback; - - static TaskPool pool; - WaitAsyncSource nextNode; - ref WaitAsyncSource ITaskPoolNode.NextNode => ref nextNode; - - static WaitAsyncSource() - { - TaskPool.RegisterSizeGetter(typeof(WaitAsyncSource), () => pool.Size); - } - - AsyncReactiveProperty parent; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - UniTaskCompletionSourceCore core; - - WaitAsyncSource() - { - } - - public static IUniTaskSource Create(AsyncReactiveProperty parent, CancellationToken cancellationToken, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new WaitAsyncSource(); - } - - result.parent = parent; - result.cancellationToken = cancellationToken; - - if (cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, result); - } - - result.parent.triggerEvent.Add(result); - - TaskTracker.TrackActiveTask(result, 3); - - token = result.core.Version; - return result; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - cancellationTokenRegistration.Dispose(); - cancellationTokenRegistration = default; - parent.triggerEvent.Remove(this); - parent = null; - cancellationToken = default; - return pool.TryPush(this); - } - - static void CancellationCallback(object state) - { - var self = (WaitAsyncSource)state; - self.OnCanceled(self.cancellationToken); - } - - // IUniTaskSource - - public T GetResult(short token) - { - try - { - return core.GetResult(token); - } - finally - { - TryReturn(); - } - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - // ITriggerHandler - - ITriggerHandler ITriggerHandler.Prev { get; set; } - ITriggerHandler ITriggerHandler.Next { get; set; } - - public void OnCanceled(CancellationToken cancellationToken) - { - core.TrySetCanceled(cancellationToken); - } - - public void OnCompleted() - { - // Complete as Cancel. - core.TrySetCanceled(CancellationToken.None); - } - - public void OnError(Exception ex) - { - core.TrySetException(ex); - } - - public void OnNext(T value) - { - core.TrySetResult(value); - } - } - - sealed class WithoutCurrentEnumerable : IUniTaskAsyncEnumerable - { - readonly AsyncReactiveProperty parent; - - public WithoutCurrentEnumerable(AsyncReactiveProperty parent) - { - this.parent = parent; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new Enumerator(parent, cancellationToken, false); - } - } - - sealed class Enumerator : MoveNextSource, IUniTaskAsyncEnumerator, ITriggerHandler - { - static Action cancellationCallback = CancellationCallback; - - readonly AsyncReactiveProperty parent; - readonly CancellationToken cancellationToken; - readonly CancellationTokenRegistration cancellationTokenRegistration; - T value; - bool isDisposed; - bool firstCall; - - public Enumerator(AsyncReactiveProperty parent, CancellationToken cancellationToken, bool publishCurrentValue) - { - this.parent = parent; - this.cancellationToken = cancellationToken; - this.firstCall = publishCurrentValue; - - parent.triggerEvent.Add(this); - TaskTracker.TrackActiveTask(this, 3); - - if (cancellationToken.CanBeCanceled) - { - cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, this); - } - } - - public T Current => value; - - ITriggerHandler ITriggerHandler.Prev { get; set; } - ITriggerHandler ITriggerHandler.Next { get; set; } - - public UniTask MoveNextAsync() - { - // raise latest value on first call. - if (firstCall) - { - firstCall = false; - value = parent.Value; - return CompletedTasks.True; - } - - completionSource.Reset(); - return new UniTask(this, completionSource.Version); - } - - public UniTask DisposeAsync() - { - if (!isDisposed) - { - isDisposed = true; - TaskTracker.RemoveTracking(this); - completionSource.TrySetCanceled(cancellationToken); - parent.triggerEvent.Remove(this); - } - return default; - } - - public void OnNext(T value) - { - this.value = value; - completionSource.TrySetResult(true); - } - - public void OnCanceled(CancellationToken cancellationToken) - { - DisposeAsync().Forget(); - } - - public void OnCompleted() - { - completionSource.TrySetResult(false); - } - - public void OnError(Exception ex) - { - completionSource.TrySetException(ex); - } - - static void CancellationCallback(object state) - { - var self = (Enumerator)state; - self.DisposeAsync().Forget(); - } - } - } - - public class ReadOnlyAsyncReactiveProperty : IReadOnlyAsyncReactiveProperty, IDisposable - { - TriggerEvent triggerEvent; - - T latestValue; - IUniTaskAsyncEnumerator enumerator; - - public T Value - { - get - { - return latestValue; - } - } - - public ReadOnlyAsyncReactiveProperty(T initialValue, IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - latestValue = initialValue; - ConsumeEnumerator(source, cancellationToken).Forget(); - } - - public ReadOnlyAsyncReactiveProperty(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - ConsumeEnumerator(source, cancellationToken).Forget(); - } - - async UniTaskVoid ConsumeEnumerator(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - enumerator = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await enumerator.MoveNextAsync()) - { - var value = enumerator.Current; - this.latestValue = value; - triggerEvent.SetResult(value); - } - } - finally - { - await enumerator.DisposeAsync(); - enumerator = null; - } - } - - public IUniTaskAsyncEnumerable WithoutCurrent() - { - return new WithoutCurrentEnumerable(this); - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken) - { - return new Enumerator(this, cancellationToken, true); - } - - public void Dispose() - { - if (enumerator != null) - { - enumerator.DisposeAsync().Forget(); - } - - triggerEvent.SetCompleted(); - } - - public static implicit operator T(ReadOnlyAsyncReactiveProperty value) - { - return value.Value; - } - - public override string ToString() - { - if (isValueType) return latestValue.ToString(); - return latestValue?.ToString(); - } - - public UniTask WaitAsync(CancellationToken cancellationToken = default) - { - return new UniTask(WaitAsyncSource.Create(this, cancellationToken, out var token), token); - } - - static bool isValueType; - - static ReadOnlyAsyncReactiveProperty() - { - isValueType = typeof(T).IsValueType; - } - - sealed class WaitAsyncSource : IUniTaskSource, ITriggerHandler, ITaskPoolNode - { - static Action cancellationCallback = CancellationCallback; - - static TaskPool pool; - WaitAsyncSource nextNode; - ref WaitAsyncSource ITaskPoolNode.NextNode => ref nextNode; - - static WaitAsyncSource() - { - TaskPool.RegisterSizeGetter(typeof(WaitAsyncSource), () => pool.Size); - } - - ReadOnlyAsyncReactiveProperty parent; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - UniTaskCompletionSourceCore core; - - WaitAsyncSource() - { - } - - public static IUniTaskSource Create(ReadOnlyAsyncReactiveProperty parent, CancellationToken cancellationToken, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new WaitAsyncSource(); - } - - result.parent = parent; - result.cancellationToken = cancellationToken; - - if (cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, result); - } - - result.parent.triggerEvent.Add(result); - - TaskTracker.TrackActiveTask(result, 3); - - token = result.core.Version; - return result; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - cancellationTokenRegistration.Dispose(); - cancellationTokenRegistration = default; - parent.triggerEvent.Remove(this); - parent = null; - cancellationToken = default; - return pool.TryPush(this); - } - - static void CancellationCallback(object state) - { - var self = (WaitAsyncSource)state; - self.OnCanceled(self.cancellationToken); - } - - // IUniTaskSource - - public T GetResult(short token) - { - try - { - return core.GetResult(token); - } - finally - { - TryReturn(); - } - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - // ITriggerHandler - - ITriggerHandler ITriggerHandler.Prev { get; set; } - ITriggerHandler ITriggerHandler.Next { get; set; } - - public void OnCanceled(CancellationToken cancellationToken) - { - core.TrySetCanceled(cancellationToken); - } - - public void OnCompleted() - { - // Complete as Cancel. - core.TrySetCanceled(CancellationToken.None); - } - - public void OnError(Exception ex) - { - core.TrySetException(ex); - } - - public void OnNext(T value) - { - core.TrySetResult(value); - } - } - - sealed class WithoutCurrentEnumerable : IUniTaskAsyncEnumerable - { - readonly ReadOnlyAsyncReactiveProperty parent; - - public WithoutCurrentEnumerable(ReadOnlyAsyncReactiveProperty parent) - { - this.parent = parent; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new Enumerator(parent, cancellationToken, false); - } - } - - sealed class Enumerator : MoveNextSource, IUniTaskAsyncEnumerator, ITriggerHandler - { - static Action cancellationCallback = CancellationCallback; - - readonly ReadOnlyAsyncReactiveProperty parent; - readonly CancellationToken cancellationToken; - readonly CancellationTokenRegistration cancellationTokenRegistration; - T value; - bool isDisposed; - bool firstCall; - - public Enumerator(ReadOnlyAsyncReactiveProperty parent, CancellationToken cancellationToken, bool publishCurrentValue) - { - this.parent = parent; - this.cancellationToken = cancellationToken; - this.firstCall = publishCurrentValue; - - parent.triggerEvent.Add(this); - TaskTracker.TrackActiveTask(this, 3); - - if (cancellationToken.CanBeCanceled) - { - cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, this); - } - } - - public T Current => value; - ITriggerHandler ITriggerHandler.Prev { get; set; } - ITriggerHandler ITriggerHandler.Next { get; set; } - - public UniTask MoveNextAsync() - { - // raise latest value on first call. - if (firstCall) - { - firstCall = false; - value = parent.Value; - return CompletedTasks.True; - } - - completionSource.Reset(); - return new UniTask(this, completionSource.Version); - } - - public UniTask DisposeAsync() - { - if (!isDisposed) - { - isDisposed = true; - TaskTracker.RemoveTracking(this); - completionSource.TrySetCanceled(cancellationToken); - parent.triggerEvent.Remove(this); - } - return default; - } - - public void OnNext(T value) - { - this.value = value; - completionSource.TrySetResult(true); - } - - public void OnCanceled(CancellationToken cancellationToken) - { - DisposeAsync().Forget(); - } - - public void OnCompleted() - { - completionSource.TrySetResult(false); - } - - public void OnError(Exception ex) - { - completionSource.TrySetException(ex); - } - - static void CancellationCallback(object state) - { - var self = (Enumerator)state; - self.DisposeAsync().Forget(); - } - } - } - - public static class StateExtensions - { - public static ReadOnlyAsyncReactiveProperty ToReadOnlyAsyncReactiveProperty(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - return new ReadOnlyAsyncReactiveProperty(source, cancellationToken); - } - - public static ReadOnlyAsyncReactiveProperty ToReadOnlyAsyncReactiveProperty(this IUniTaskAsyncEnumerable source, T initialValue, CancellationToken cancellationToken) - { - return new ReadOnlyAsyncReactiveProperty(initialValue, source, cancellationToken); - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/AsyncReactiveProperty.cs.meta b/VirtueSky/UniTask/Runtime/AsyncReactiveProperty.cs.meta deleted file mode 100644 index d64e3cff..00000000 --- a/VirtueSky/UniTask/Runtime/AsyncReactiveProperty.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8ef320b87f537ee4fb2282e765dc6166 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/AsyncUnit.cs b/VirtueSky/UniTask/Runtime/AsyncUnit.cs deleted file mode 100644 index 7fdd645c..00000000 --- a/VirtueSky/UniTask/Runtime/AsyncUnit.cs +++ /dev/null @@ -1,26 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or - -using System; - -namespace VirtueSky.Threading.Tasks -{ - public readonly struct AsyncUnit : IEquatable - { - public static readonly AsyncUnit Default = new AsyncUnit(); - - public override int GetHashCode() - { - return 0; - } - - public bool Equals(AsyncUnit other) - { - return true; - } - - public override string ToString() - { - return "()"; - } - } -} diff --git a/VirtueSky/UniTask/Runtime/AsyncUnit.cs.meta b/VirtueSky/UniTask/Runtime/AsyncUnit.cs.meta deleted file mode 100644 index e0ee1329..00000000 --- a/VirtueSky/UniTask/Runtime/AsyncUnit.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4f95ac245430d304bb5128d13b6becc8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/CancellationTokenEqualityComparer.cs b/VirtueSky/UniTask/Runtime/CancellationTokenEqualityComparer.cs deleted file mode 100644 index cab340cd..00000000 --- a/VirtueSky/UniTask/Runtime/CancellationTokenEqualityComparer.cs +++ /dev/null @@ -1,23 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks -{ - public class CancellationTokenEqualityComparer : IEqualityComparer - { - public static readonly IEqualityComparer Default = new CancellationTokenEqualityComparer(); - - public bool Equals(CancellationToken x, CancellationToken y) - { - return x.Equals(y); - } - - public int GetHashCode(CancellationToken obj) - { - return obj.GetHashCode(); - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/CancellationTokenEqualityComparer.cs.meta b/VirtueSky/UniTask/Runtime/CancellationTokenEqualityComparer.cs.meta deleted file mode 100644 index a4fe3fd9..00000000 --- a/VirtueSky/UniTask/Runtime/CancellationTokenEqualityComparer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7d739f510b125b74fa7290ac4335e46e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/CancellationTokenExtensions.cs b/VirtueSky/UniTask/Runtime/CancellationTokenExtensions.cs deleted file mode 100644 index 0ed2fd69..00000000 --- a/VirtueSky/UniTask/Runtime/CancellationTokenExtensions.cs +++ /dev/null @@ -1,182 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Runtime.CompilerServices; -using System.Threading; - -namespace VirtueSky.Threading.Tasks -{ - public static class CancellationTokenExtensions - { - static readonly Action cancellationTokenCallback = Callback; - static readonly Action disposeCallback = DisposeCallback; - - public static CancellationToken ToCancellationToken(this UniTask task) - { - var cts = new CancellationTokenSource(); - ToCancellationTokenCore(task, cts).Forget(); - return cts.Token; - } - - public static CancellationToken ToCancellationToken(this UniTask task, CancellationToken linkToken) - { - if (linkToken.IsCancellationRequested) - { - return linkToken; - } - - if (!linkToken.CanBeCanceled) - { - return ToCancellationToken(task); - } - - var cts = CancellationTokenSource.CreateLinkedTokenSource(linkToken); - ToCancellationTokenCore(task, cts).Forget(); - - return cts.Token; - } - - public static CancellationToken ToCancellationToken(this UniTask task) - { - return ToCancellationToken(task.AsUniTask()); - } - - public static CancellationToken ToCancellationToken(this UniTask task, CancellationToken linkToken) - { - return ToCancellationToken(task.AsUniTask(), linkToken); - } - - static async UniTaskVoid ToCancellationTokenCore(UniTask task, CancellationTokenSource cts) - { - try - { - await task; - } - catch (Exception ex) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - } - cts.Cancel(); - cts.Dispose(); - } - - public static (UniTask, CancellationTokenRegistration) ToUniTask(this CancellationToken cancellationToken) - { - if (cancellationToken.IsCancellationRequested) - { - return (UniTask.FromCanceled(cancellationToken), default(CancellationTokenRegistration)); - } - - var promise = new UniTaskCompletionSource(); - return (promise.Task, cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationTokenCallback, promise)); - } - - static void Callback(object state) - { - var promise = (UniTaskCompletionSource)state; - promise.TrySetResult(); - } - - public static CancellationTokenAwaitable WaitUntilCanceled(this CancellationToken cancellationToken) - { - return new CancellationTokenAwaitable(cancellationToken); - } - - public static CancellationTokenRegistration RegisterWithoutCaptureExecutionContext(this CancellationToken cancellationToken, Action callback) - { - var restoreFlow = false; - if (!ExecutionContext.IsFlowSuppressed()) - { - ExecutionContext.SuppressFlow(); - restoreFlow = true; - } - - try - { - return cancellationToken.Register(callback, false); - } - finally - { - if (restoreFlow) - { - ExecutionContext.RestoreFlow(); - } - } - } - - public static CancellationTokenRegistration RegisterWithoutCaptureExecutionContext(this CancellationToken cancellationToken, Action callback, object state) - { - var restoreFlow = false; - if (!ExecutionContext.IsFlowSuppressed()) - { - ExecutionContext.SuppressFlow(); - restoreFlow = true; - } - - try - { - return cancellationToken.Register(callback, state, false); - } - finally - { - if (restoreFlow) - { - ExecutionContext.RestoreFlow(); - } - } - } - - public static CancellationTokenRegistration AddTo(this IDisposable disposable, CancellationToken cancellationToken) - { - return cancellationToken.RegisterWithoutCaptureExecutionContext(disposeCallback, disposable); - } - - static void DisposeCallback(object state) - { - var d = (IDisposable)state; - d.Dispose(); - } - } - - public struct CancellationTokenAwaitable - { - CancellationToken cancellationToken; - - public CancellationTokenAwaitable(CancellationToken cancellationToken) - { - this.cancellationToken = cancellationToken; - } - - public Awaiter GetAwaiter() - { - return new Awaiter(cancellationToken); - } - - public struct Awaiter : ICriticalNotifyCompletion - { - CancellationToken cancellationToken; - - public Awaiter(CancellationToken cancellationToken) - { - this.cancellationToken = cancellationToken; - } - - public bool IsCompleted => !cancellationToken.CanBeCanceled || cancellationToken.IsCancellationRequested; - - public void GetResult() - { - } - - public void OnCompleted(Action continuation) - { - UnsafeOnCompleted(continuation); - } - - public void UnsafeOnCompleted(Action continuation) - { - cancellationToken.RegisterWithoutCaptureExecutionContext(continuation); - } - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/CancellationTokenExtensions.cs.meta b/VirtueSky/UniTask/Runtime/CancellationTokenExtensions.cs.meta deleted file mode 100644 index 28a69586..00000000 --- a/VirtueSky/UniTask/Runtime/CancellationTokenExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4be7209f04146bd45ac5ee775a5f7c26 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/CancellationTokenSourceExtensions.cs b/VirtueSky/UniTask/Runtime/CancellationTokenSourceExtensions.cs deleted file mode 100644 index b1e64ac0..00000000 --- a/VirtueSky/UniTask/Runtime/CancellationTokenSourceExtensions.cs +++ /dev/null @@ -1,44 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System.Threading; -using UnityEngine; -using VirtueSky.Threading.Tasks.Triggers; -using System; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks -{ - - public static partial class CancellationTokenSourceExtensions - { - readonly static Action CancelCancellationTokenSourceStateDelegate = new Action(CancelCancellationTokenSourceState); - - static void CancelCancellationTokenSourceState(object state) - { - var cts = (CancellationTokenSource)state; - cts.Cancel(); - } - - public static IDisposable CancelAfterSlim(this CancellationTokenSource cts, int millisecondsDelay, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update) - { - return CancelAfterSlim(cts, TimeSpan.FromMilliseconds(millisecondsDelay), delayType, delayTiming); - } - - public static IDisposable CancelAfterSlim(this CancellationTokenSource cts, TimeSpan delayTimeSpan, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update) - { - return PlayerLoopTimer.StartNew(delayTimeSpan, false, delayType, delayTiming, cts.Token, CancelCancellationTokenSourceStateDelegate, cts); - } - - public static void RegisterRaiseCancelOnDestroy(this CancellationTokenSource cts, Component component) - { - RegisterRaiseCancelOnDestroy(cts, component.gameObject); - } - - public static void RegisterRaiseCancelOnDestroy(this CancellationTokenSource cts, GameObject gameObject) - { - var trigger = gameObject.GetAsyncDestroyTrigger(); - trigger.CancellationToken.RegisterWithoutCaptureExecutionContext(CancelCancellationTokenSourceStateDelegate, cts); - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/CancellationTokenSourceExtensions.cs.meta b/VirtueSky/UniTask/Runtime/CancellationTokenSourceExtensions.cs.meta deleted file mode 100644 index fd09fe4b..00000000 --- a/VirtueSky/UniTask/Runtime/CancellationTokenSourceExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 22d85d07f1e70ab42a7a4c25bd65e661 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Channel.cs b/VirtueSky/UniTask/Runtime/Channel.cs deleted file mode 100644 index e9a45bd8..00000000 --- a/VirtueSky/UniTask/Runtime/Channel.cs +++ /dev/null @@ -1,450 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks -{ - public static class Channel - { - public static Channel CreateSingleConsumerUnbounded() - { - return new SingleConsumerUnboundedChannel(); - } - } - - public abstract class Channel - { - public ChannelReader Reader { get; protected set; } - public ChannelWriter Writer { get; protected set; } - - public static implicit operator ChannelReader(Channel channel) => channel.Reader; - public static implicit operator ChannelWriter(Channel channel) => channel.Writer; - } - - public abstract class Channel : Channel - { - } - - public abstract class ChannelReader - { - public abstract bool TryRead(out T item); - public abstract UniTask WaitToReadAsync(CancellationToken cancellationToken = default(CancellationToken)); - - public abstract UniTask Completion { get; } - - public virtual UniTask ReadAsync(CancellationToken cancellationToken = default(CancellationToken)) - { - if (this.TryRead(out var item)) - { - return UniTask.FromResult(item); - } - - return ReadAsyncCore(cancellationToken); - } - - async UniTask ReadAsyncCore(CancellationToken cancellationToken = default(CancellationToken)) - { - if (await WaitToReadAsync(cancellationToken)) - { - if (TryRead(out var item)) - { - return item; - } - } - - throw new ChannelClosedException(); - } - - public abstract IUniTaskAsyncEnumerable ReadAllAsync(CancellationToken cancellationToken = default(CancellationToken)); - } - - public abstract class ChannelWriter - { - public abstract bool TryWrite(T item); - public abstract bool TryComplete(Exception error = null); - - public void Complete(Exception error = null) - { - if (!TryComplete(error)) - { - throw new ChannelClosedException(); - } - } - } - - public partial class ChannelClosedException : InvalidOperationException - { - public ChannelClosedException() : - base("Channel is already closed.") - { } - - public ChannelClosedException(string message) : base(message) { } - - public ChannelClosedException(Exception innerException) : - base("Channel is already closed", innerException) - { } - - public ChannelClosedException(string message, Exception innerException) : base(message, innerException) { } - } - - internal class SingleConsumerUnboundedChannel : Channel - { - readonly Queue items; - readonly SingleConsumerUnboundedChannelReader readerSource; - UniTaskCompletionSource completedTaskSource; - UniTask completedTask; - - Exception completionError; - bool closed; - - public SingleConsumerUnboundedChannel() - { - items = new Queue(); - Writer = new SingleConsumerUnboundedChannelWriter(this); - readerSource = new SingleConsumerUnboundedChannelReader(this); - Reader = readerSource; - } - - sealed class SingleConsumerUnboundedChannelWriter : ChannelWriter - { - readonly SingleConsumerUnboundedChannel parent; - - public SingleConsumerUnboundedChannelWriter(SingleConsumerUnboundedChannel parent) - { - this.parent = parent; - } - - public override bool TryWrite(T item) - { - bool waiting; - lock (parent.items) - { - if (parent.closed) return false; - - parent.items.Enqueue(item); - waiting = parent.readerSource.isWaiting; - } - - if (waiting) - { - parent.readerSource.SingalContinuation(); - } - - return true; - } - - public override bool TryComplete(Exception error = null) - { - bool waiting; - lock (parent.items) - { - if (parent.closed) return false; - parent.closed = true; - waiting = parent.readerSource.isWaiting; - - if (parent.items.Count == 0) - { - if (error == null) - { - if (parent.completedTaskSource != null) - { - parent.completedTaskSource.TrySetResult(); - } - else - { - parent.completedTask = UniTask.CompletedTask; - } - } - else - { - if (parent.completedTaskSource != null) - { - parent.completedTaskSource.TrySetException(error); - } - else - { - parent.completedTask = UniTask.FromException(error); - } - } - - if (waiting) - { - parent.readerSource.SingalCompleted(error); - } - } - - parent.completionError = error; - } - - return true; - } - } - - sealed class SingleConsumerUnboundedChannelReader : ChannelReader, IUniTaskSource - { - readonly Action CancellationCallbackDelegate = CancellationCallback; - readonly SingleConsumerUnboundedChannel parent; - - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - UniTaskCompletionSourceCore core; - internal bool isWaiting; - - public SingleConsumerUnboundedChannelReader(SingleConsumerUnboundedChannel parent) - { - this.parent = parent; - - TaskTracker.TrackActiveTask(this, 4); - } - - public override UniTask Completion - { - get - { - if (parent.completedTaskSource != null) return parent.completedTaskSource.Task; - - if (parent.closed) - { - return parent.completedTask; - } - - parent.completedTaskSource = new UniTaskCompletionSource(); - return parent.completedTaskSource.Task; - } - } - - public override bool TryRead(out T item) - { - lock (parent.items) - { - if (parent.items.Count != 0) - { - item = parent.items.Dequeue(); - - // complete when all value was consumed. - if (parent.closed && parent.items.Count == 0) - { - if (parent.completionError != null) - { - if (parent.completedTaskSource != null) - { - parent.completedTaskSource.TrySetException(parent.completionError); - } - else - { - parent.completedTask = UniTask.FromException(parent.completionError); - } - } - else - { - if (parent.completedTaskSource != null) - { - parent.completedTaskSource.TrySetResult(); - } - else - { - parent.completedTask = UniTask.CompletedTask; - } - } - } - } - else - { - item = default; - return false; - } - } - - return true; - } - - public override UniTask WaitToReadAsync(CancellationToken cancellationToken) - { - if (cancellationToken.IsCancellationRequested) - { - return UniTask.FromCanceled(cancellationToken); - } - - lock (parent.items) - { - if (parent.items.Count != 0) - { - return CompletedTasks.True; - } - - if (parent.closed) - { - if (parent.completionError == null) - { - return CompletedTasks.False; - } - else - { - return UniTask.FromException(parent.completionError); - } - } - - cancellationTokenRegistration.Dispose(); - - core.Reset(); - isWaiting = true; - - this.cancellationToken = cancellationToken; - if (this.cancellationToken.CanBeCanceled) - { - cancellationTokenRegistration = this.cancellationToken.RegisterWithoutCaptureExecutionContext(CancellationCallbackDelegate, this); - } - - return new UniTask(this, core.Version); - } - } - - public void SingalContinuation() - { - core.TrySetResult(true); - } - - public void SingalCancellation(CancellationToken cancellationToken) - { - TaskTracker.RemoveTracking(this); - core.TrySetCanceled(cancellationToken); - } - - public void SingalCompleted(Exception error) - { - if (error != null) - { - TaskTracker.RemoveTracking(this); - core.TrySetException(error); - } - else - { - TaskTracker.RemoveTracking(this); - core.TrySetResult(false); - } - } - - public override IUniTaskAsyncEnumerable ReadAllAsync(CancellationToken cancellationToken = default) - { - return new ReadAllAsyncEnumerable(this, cancellationToken); - } - - bool IUniTaskSource.GetResult(short token) - { - return core.GetResult(token); - } - - void IUniTaskSource.GetResult(short token) - { - core.GetResult(token); - } - - UniTaskStatus IUniTaskSource.GetStatus(short token) - { - return core.GetStatus(token); - } - - void IUniTaskSource.OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - UniTaskStatus IUniTaskSource.UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - static void CancellationCallback(object state) - { - var self = (SingleConsumerUnboundedChannelReader)state; - self.SingalCancellation(self.cancellationToken); - } - - sealed class ReadAllAsyncEnumerable : IUniTaskAsyncEnumerable, IUniTaskAsyncEnumerator - { - readonly Action CancellationCallback1Delegate = CancellationCallback1; - readonly Action CancellationCallback2Delegate = CancellationCallback2; - - readonly SingleConsumerUnboundedChannelReader parent; - CancellationToken cancellationToken1; - CancellationToken cancellationToken2; - CancellationTokenRegistration cancellationTokenRegistration1; - CancellationTokenRegistration cancellationTokenRegistration2; - - T current; - bool cacheValue; - bool running; - - public ReadAllAsyncEnumerable(SingleConsumerUnboundedChannelReader parent, CancellationToken cancellationToken) - { - this.parent = parent; - this.cancellationToken1 = cancellationToken; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - if (running) - { - throw new InvalidOperationException("Enumerator is already running, does not allow call GetAsyncEnumerator twice."); - } - - if (this.cancellationToken1 != cancellationToken) - { - this.cancellationToken2 = cancellationToken; - } - - if (this.cancellationToken1.CanBeCanceled) - { - this.cancellationTokenRegistration1 = this.cancellationToken1.RegisterWithoutCaptureExecutionContext(CancellationCallback1Delegate, this); - } - - if (this.cancellationToken2.CanBeCanceled) - { - this.cancellationTokenRegistration2 = this.cancellationToken2.RegisterWithoutCaptureExecutionContext(CancellationCallback2Delegate, this); - } - - running = true; - return this; - } - - public T Current - { - get - { - if (cacheValue) - { - return current; - } - parent.TryRead(out current); - return current; - } - } - - public UniTask MoveNextAsync() - { - cacheValue = false; - return parent.WaitToReadAsync(CancellationToken.None); // ok to use None, registered in ctor. - } - - public UniTask DisposeAsync() - { - cancellationTokenRegistration1.Dispose(); - cancellationTokenRegistration2.Dispose(); - return default; - } - - static void CancellationCallback1(object state) - { - var self = (ReadAllAsyncEnumerable)state; - self.parent.SingalCancellation(self.cancellationToken1); - } - - static void CancellationCallback2(object state) - { - var self = (ReadAllAsyncEnumerable)state; - self.parent.SingalCancellation(self.cancellationToken2); - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Channel.cs.meta b/VirtueSky/UniTask/Runtime/Channel.cs.meta deleted file mode 100644 index 32edb9c0..00000000 --- a/VirtueSky/UniTask/Runtime/Channel.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5ceb3107bbdd1f14eb39091273798360 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/CompilerServices.meta b/VirtueSky/UniTask/Runtime/CompilerServices.meta deleted file mode 100644 index dd59a4cc..00000000 --- a/VirtueSky/UniTask/Runtime/CompilerServices.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: f47eea80e3630dc48a994aa4fcd69067 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/CompilerServices/AsyncMethodBuilderAttribute.cs b/VirtueSky/UniTask/Runtime/CompilerServices/AsyncMethodBuilderAttribute.cs deleted file mode 100644 index 700fc339..00000000 --- a/VirtueSky/UniTask/Runtime/CompilerServices/AsyncMethodBuilderAttribute.cs +++ /dev/null @@ -1,17 +0,0 @@ - -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -#pragma warning disable CS0436 - -namespace System.Runtime.CompilerServices -{ - internal sealed class AsyncMethodBuilderAttribute : Attribute - { - public Type BuilderType { get; } - - public AsyncMethodBuilderAttribute(Type builderType) - { - BuilderType = builderType; - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/CompilerServices/AsyncMethodBuilderAttribute.cs.meta b/VirtueSky/UniTask/Runtime/CompilerServices/AsyncMethodBuilderAttribute.cs.meta deleted file mode 100644 index 19961dfb..00000000 --- a/VirtueSky/UniTask/Runtime/CompilerServices/AsyncMethodBuilderAttribute.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 02ce354d37b10454e8376062f7cbe57a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/CompilerServices/AsyncUniTaskMethodBuilder.cs b/VirtueSky/UniTask/Runtime/CompilerServices/AsyncUniTaskMethodBuilder.cs deleted file mode 100644 index 5cf97084..00000000 --- a/VirtueSky/UniTask/Runtime/CompilerServices/AsyncUniTaskMethodBuilder.cs +++ /dev/null @@ -1,269 +0,0 @@ - -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Diagnostics; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace VirtueSky.Threading.Tasks.CompilerServices -{ - [StructLayout(LayoutKind.Auto)] - public struct AsyncUniTaskMethodBuilder - { - IStateMachineRunnerPromise runnerPromise; - Exception ex; - - // 1. Static Create method. - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static AsyncUniTaskMethodBuilder Create() - { - return default; - } - - // 2. TaskLike Task property. - public UniTask Task - { - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - if (runnerPromise != null) - { - return runnerPromise.Task; - } - else if (ex != null) - { - return UniTask.FromException(ex); - } - else - { - return UniTask.CompletedTask; - } - } - } - - // 3. SetException - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void SetException(Exception exception) - { - if (runnerPromise == null) - { - ex = exception; - } - else - { - runnerPromise.SetException(exception); - } - } - - // 4. SetResult - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void SetResult() - { - if (runnerPromise != null) - { - runnerPromise.SetResult(); - } - } - - // 5. AwaitOnCompleted - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void AwaitOnCompleted(ref TAwaiter awaiter, ref TStateMachine stateMachine) - where TAwaiter : INotifyCompletion - where TStateMachine : IAsyncStateMachine - { - if (runnerPromise == null) - { - AsyncUniTask.SetStateMachine(ref stateMachine, ref runnerPromise); - } - - awaiter.OnCompleted(runnerPromise.MoveNext); - } - - // 6. AwaitUnsafeOnCompleted - [DebuggerHidden] - [SecuritySafeCritical] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void AwaitUnsafeOnCompleted(ref TAwaiter awaiter, ref TStateMachine stateMachine) - where TAwaiter : ICriticalNotifyCompletion - where TStateMachine : IAsyncStateMachine - { - if (runnerPromise == null) - { - AsyncUniTask.SetStateMachine(ref stateMachine, ref runnerPromise); - } - - awaiter.UnsafeOnCompleted(runnerPromise.MoveNext); - } - - // 7. Start - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void Start(ref TStateMachine stateMachine) - where TStateMachine : IAsyncStateMachine - { - stateMachine.MoveNext(); - } - - // 8. SetStateMachine - [DebuggerHidden] - public void SetStateMachine(IAsyncStateMachine stateMachine) - { - // don't use boxed stateMachine. - } - -#if DEBUG || !UNITY_2018_3_OR_NEWER - // Important for IDE debugger. - object debuggingId; - private object ObjectIdForDebugger - { - get - { - if (debuggingId == null) - { - debuggingId = new object(); - } - return debuggingId; - } - } -#endif - } - - [StructLayout(LayoutKind.Auto)] - public struct AsyncUniTaskMethodBuilder - { - IStateMachineRunnerPromise runnerPromise; - Exception ex; - T result; - - // 1. Static Create method. - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static AsyncUniTaskMethodBuilder Create() - { - return default; - } - - // 2. TaskLike Task property. - public UniTask Task - { - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - if (runnerPromise != null) - { - return runnerPromise.Task; - } - else if (ex != null) - { - return UniTask.FromException(ex); - } - else - { - return UniTask.FromResult(result); - } - } - } - - // 3. SetException - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void SetException(Exception exception) - { - if (runnerPromise == null) - { - ex = exception; - } - else - { - runnerPromise.SetException(exception); - } - } - - // 4. SetResult - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void SetResult(T result) - { - if (runnerPromise == null) - { - this.result = result; - } - else - { - runnerPromise.SetResult(result); - } - } - - // 5. AwaitOnCompleted - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void AwaitOnCompleted(ref TAwaiter awaiter, ref TStateMachine stateMachine) - where TAwaiter : INotifyCompletion - where TStateMachine : IAsyncStateMachine - { - if (runnerPromise == null) - { - AsyncUniTask.SetStateMachine(ref stateMachine, ref runnerPromise); - } - - awaiter.OnCompleted(runnerPromise.MoveNext); - } - - // 6. AwaitUnsafeOnCompleted - [DebuggerHidden] - [SecuritySafeCritical] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void AwaitUnsafeOnCompleted(ref TAwaiter awaiter, ref TStateMachine stateMachine) - where TAwaiter : ICriticalNotifyCompletion - where TStateMachine : IAsyncStateMachine - { - if (runnerPromise == null) - { - AsyncUniTask.SetStateMachine(ref stateMachine, ref runnerPromise); - } - - awaiter.UnsafeOnCompleted(runnerPromise.MoveNext); - } - - // 7. Start - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void Start(ref TStateMachine stateMachine) - where TStateMachine : IAsyncStateMachine - { - stateMachine.MoveNext(); - } - - // 8. SetStateMachine - [DebuggerHidden] - public void SetStateMachine(IAsyncStateMachine stateMachine) - { - // don't use boxed stateMachine. - } - -#if DEBUG || !UNITY_2018_3_OR_NEWER - // Important for IDE debugger. - object debuggingId; - private object ObjectIdForDebugger - { - get - { - if (debuggingId == null) - { - debuggingId = new object(); - } - return debuggingId; - } - } -#endif - - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/CompilerServices/AsyncUniTaskMethodBuilder.cs.meta b/VirtueSky/UniTask/Runtime/CompilerServices/AsyncUniTaskMethodBuilder.cs.meta deleted file mode 100644 index ad43cfcf..00000000 --- a/VirtueSky/UniTask/Runtime/CompilerServices/AsyncUniTaskMethodBuilder.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 68d72a45afdec574ebc26e7de2c38330 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/CompilerServices/AsyncUniTaskVoidMethodBuilder.cs b/VirtueSky/UniTask/Runtime/CompilerServices/AsyncUniTaskVoidMethodBuilder.cs deleted file mode 100644 index 0b1f573e..00000000 --- a/VirtueSky/UniTask/Runtime/CompilerServices/AsyncUniTaskVoidMethodBuilder.cs +++ /dev/null @@ -1,137 +0,0 @@ - -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Diagnostics; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace VirtueSky.Threading.Tasks.CompilerServices -{ - [StructLayout(LayoutKind.Auto)] - public struct AsyncUniTaskVoidMethodBuilder - { - IStateMachineRunner runner; - - // 1. Static Create method. - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static AsyncUniTaskVoidMethodBuilder Create() - { - return default; - } - - // 2. TaskLike Task property(void) - public UniTaskVoid Task - { - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return default; - } - } - - // 3. SetException - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void SetException(Exception exception) - { - // runner is finished, return first. - if (runner != null) - { -#if ENABLE_IL2CPP - // workaround for IL2CPP bug. - PlayerLoopHelper.AddContinuation(PlayerLoopTiming.LastPostLateUpdate, runner.ReturnAction); -#else - runner.Return(); -#endif - runner = null; - } - - UniTaskScheduler.PublishUnobservedTaskException(exception); - } - - // 4. SetResult - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void SetResult() - { - // runner is finished, return. - if (runner != null) - { -#if ENABLE_IL2CPP - // workaround for IL2CPP bug. - PlayerLoopHelper.AddContinuation(PlayerLoopTiming.LastPostLateUpdate, runner.ReturnAction); -#else - runner.Return(); -#endif - runner = null; - } - } - - // 5. AwaitOnCompleted - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void AwaitOnCompleted(ref TAwaiter awaiter, ref TStateMachine stateMachine) - where TAwaiter : INotifyCompletion - where TStateMachine : IAsyncStateMachine - { - if (runner == null) - { - AsyncUniTaskVoid.SetStateMachine(ref stateMachine, ref runner); - } - - awaiter.OnCompleted(runner.MoveNext); - } - - // 6. AwaitUnsafeOnCompleted - [DebuggerHidden] - [SecuritySafeCritical] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void AwaitUnsafeOnCompleted(ref TAwaiter awaiter, ref TStateMachine stateMachine) - where TAwaiter : ICriticalNotifyCompletion - where TStateMachine : IAsyncStateMachine - { - if (runner == null) - { - AsyncUniTaskVoid.SetStateMachine(ref stateMachine, ref runner); - } - - awaiter.UnsafeOnCompleted(runner.MoveNext); - } - - // 7. Start - [DebuggerHidden] - public void Start(ref TStateMachine stateMachine) - where TStateMachine : IAsyncStateMachine - { - stateMachine.MoveNext(); - } - - // 8. SetStateMachine - [DebuggerHidden] - public void SetStateMachine(IAsyncStateMachine stateMachine) - { - // don't use boxed stateMachine. - } - -#if DEBUG || !UNITY_2018_3_OR_NEWER - // Important for IDE debugger. - object debuggingId; - private object ObjectIdForDebugger - { - get - { - if (debuggingId == null) - { - debuggingId = new object(); - } - return debuggingId; - } - } -#endif - } -} - diff --git a/VirtueSky/UniTask/Runtime/CompilerServices/AsyncUniTaskVoidMethodBuilder.cs.meta b/VirtueSky/UniTask/Runtime/CompilerServices/AsyncUniTaskVoidMethodBuilder.cs.meta deleted file mode 100644 index 9bcc50e0..00000000 --- a/VirtueSky/UniTask/Runtime/CompilerServices/AsyncUniTaskVoidMethodBuilder.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e891aaac17b933a47a9d7fa3b8e1226f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/CompilerServices/StateMachineRunner.cs b/VirtueSky/UniTask/Runtime/CompilerServices/StateMachineRunner.cs deleted file mode 100644 index 15ab4b00..00000000 --- a/VirtueSky/UniTask/Runtime/CompilerServices/StateMachineRunner.cs +++ /dev/null @@ -1,380 +0,0 @@ -#pragma warning disable CS1591 - -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Linq; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace VirtueSky.Threading.Tasks.CompilerServices -{ - // #ENABLE_IL2CPP in this file is to avoid bug of IL2CPP VM. - // Issue is tracked on https://issuetracker.unity3d.com/issues/il2cpp-incorrect-results-when-calling-a-method-from-outside-class-in-a-struct - // but currently it is labeled `Won't Fix`. - - internal interface IStateMachineRunner - { - Action MoveNext { get; } - void Return(); - -#if ENABLE_IL2CPP - Action ReturnAction { get; } -#endif - } - - internal interface IStateMachineRunnerPromise : IUniTaskSource - { - Action MoveNext { get; } - UniTask Task { get; } - void SetResult(); - void SetException(Exception exception); - } - - internal interface IStateMachineRunnerPromise : IUniTaskSource - { - Action MoveNext { get; } - UniTask Task { get; } - void SetResult(T result); - void SetException(Exception exception); - } - - internal static class StateMachineUtility - { - // Get AsyncStateMachine internal state to check IL2CPP bug - public static int GetState(IAsyncStateMachine stateMachine) - { - var info = stateMachine.GetType().GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) - .First(x => x.Name.EndsWith("__state")); - return (int)info.GetValue(stateMachine); - } - } - - internal sealed class AsyncUniTaskVoid : IStateMachineRunner, ITaskPoolNode>, IUniTaskSource - where TStateMachine : IAsyncStateMachine - { - static TaskPool> pool; - -#if ENABLE_IL2CPP - public Action ReturnAction { get; } -#endif - - TStateMachine stateMachine; - - public Action MoveNext { get; } - - public AsyncUniTaskVoid() - { - MoveNext = Run; -#if ENABLE_IL2CPP - ReturnAction = Return; -#endif - } - - public static void SetStateMachine(ref TStateMachine stateMachine, ref IStateMachineRunner runnerFieldRef) - { - if (!pool.TryPop(out var result)) - { - result = new AsyncUniTaskVoid(); - } - TaskTracker.TrackActiveTask(result, 3); - - runnerFieldRef = result; // set runner before copied. - result.stateMachine = stateMachine; // copy struct StateMachine(in release build). - } - - static AsyncUniTaskVoid() - { - TaskPool.RegisterSizeGetter(typeof(AsyncUniTaskVoid), () => pool.Size); - } - - AsyncUniTaskVoid nextNode; - public ref AsyncUniTaskVoid NextNode => ref nextNode; - - public void Return() - { - TaskTracker.RemoveTracking(this); - stateMachine = default; - pool.TryPush(this); - } - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - void Run() - { - stateMachine.MoveNext(); - } - - // dummy interface implementation for TaskTracker. - - UniTaskStatus IUniTaskSource.GetStatus(short token) - { - return UniTaskStatus.Pending; - } - - UniTaskStatus IUniTaskSource.UnsafeGetStatus() - { - return UniTaskStatus.Pending; - } - - void IUniTaskSource.OnCompleted(Action continuation, object state, short token) - { - } - - void IUniTaskSource.GetResult(short token) - { - } - } - - internal sealed class AsyncUniTask : IStateMachineRunnerPromise, IUniTaskSource, ITaskPoolNode> - where TStateMachine : IAsyncStateMachine - { - static TaskPool> pool; - -#if ENABLE_IL2CPP - readonly Action returnDelegate; -#endif - public Action MoveNext { get; } - - TStateMachine stateMachine; - UniTaskCompletionSourceCore core; - - AsyncUniTask() - { - MoveNext = Run; -#if ENABLE_IL2CPP - returnDelegate = Return; -#endif - } - - public static void SetStateMachine(ref TStateMachine stateMachine, ref IStateMachineRunnerPromise runnerPromiseFieldRef) - { - if (!pool.TryPop(out var result)) - { - result = new AsyncUniTask(); - } - TaskTracker.TrackActiveTask(result, 3); - - runnerPromiseFieldRef = result; // set runner before copied. - result.stateMachine = stateMachine; // copy struct StateMachine(in release build). - } - - AsyncUniTask nextNode; - public ref AsyncUniTask NextNode => ref nextNode; - - static AsyncUniTask() - { - TaskPool.RegisterSizeGetter(typeof(AsyncUniTask), () => pool.Size); - } - - void Return() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - stateMachine = default; - pool.TryPush(this); - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - stateMachine = default; - return pool.TryPush(this); - } - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - void Run() - { - stateMachine.MoveNext(); - } - - public UniTask Task - { - [DebuggerHidden] - get - { - return new UniTask(this, core.Version); - } - } - - [DebuggerHidden] - public void SetResult() - { - core.TrySetResult(AsyncUnit.Default); - } - - [DebuggerHidden] - public void SetException(Exception exception) - { - core.TrySetException(exception); - } - - [DebuggerHidden] - public void GetResult(short token) - { - try - { - core.GetResult(token); - } - finally - { -#if ENABLE_IL2CPP - // workaround for IL2CPP bug. - PlayerLoopHelper.AddContinuation(PlayerLoopTiming.LastPostLateUpdate, returnDelegate); -#else - TryReturn(); -#endif - } - } - - [DebuggerHidden] - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - [DebuggerHidden] - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - [DebuggerHidden] - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - - internal sealed class AsyncUniTask : IStateMachineRunnerPromise, IUniTaskSource, ITaskPoolNode> - where TStateMachine : IAsyncStateMachine - { - static TaskPool> pool; - -#if ENABLE_IL2CPP - readonly Action returnDelegate; -#endif - - public Action MoveNext { get; } - - TStateMachine stateMachine; - UniTaskCompletionSourceCore core; - - AsyncUniTask() - { - MoveNext = Run; -#if ENABLE_IL2CPP - returnDelegate = Return; -#endif - } - - public static void SetStateMachine(ref TStateMachine stateMachine, ref IStateMachineRunnerPromise runnerPromiseFieldRef) - { - if (!pool.TryPop(out var result)) - { - result = new AsyncUniTask(); - } - TaskTracker.TrackActiveTask(result, 3); - - runnerPromiseFieldRef = result; // set runner before copied. - result.stateMachine = stateMachine; // copy struct StateMachine(in release build). - } - - AsyncUniTask nextNode; - public ref AsyncUniTask NextNode => ref nextNode; - - static AsyncUniTask() - { - TaskPool.RegisterSizeGetter(typeof(AsyncUniTask), () => pool.Size); - } - - void Return() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - stateMachine = default; - pool.TryPush(this); - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - stateMachine = default; - return pool.TryPush(this); - } - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - void Run() - { - // UnityEngine.Debug.Log($"MoveNext State:" + StateMachineUtility.GetState(stateMachine)); - stateMachine.MoveNext(); - } - - public UniTask Task - { - [DebuggerHidden] - get - { - return new UniTask(this, core.Version); - } - } - - [DebuggerHidden] - public void SetResult(T result) - { - core.TrySetResult(result); - } - - [DebuggerHidden] - public void SetException(Exception exception) - { - core.TrySetException(exception); - } - - [DebuggerHidden] - public T GetResult(short token) - { - try - { - return core.GetResult(token); - } - finally - { -#if ENABLE_IL2CPP - // workaround for IL2CPP bug. - PlayerLoopHelper.AddContinuation(PlayerLoopTiming.LastPostLateUpdate, returnDelegate); -#else - TryReturn(); -#endif - } - } - - [DebuggerHidden] - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - [DebuggerHidden] - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - [DebuggerHidden] - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - [DebuggerHidden] - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/CompilerServices/StateMachineRunner.cs.meta b/VirtueSky/UniTask/Runtime/CompilerServices/StateMachineRunner.cs.meta deleted file mode 100644 index 2cb82e08..00000000 --- a/VirtueSky/UniTask/Runtime/CompilerServices/StateMachineRunner.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 98649642833cabf44a9dc060ce4c84a1 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/EnumerableAsyncExtensions.cs b/VirtueSky/UniTask/Runtime/EnumerableAsyncExtensions.cs deleted file mode 100644 index 7245b8e8..00000000 --- a/VirtueSky/UniTask/Runtime/EnumerableAsyncExtensions.cs +++ /dev/null @@ -1,34 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Collections.Generic; - -namespace VirtueSky.Threading.Tasks -{ - public static class EnumerableAsyncExtensions - { - // overload resolver - .Select(async x => { }) : IEnumerable> - - public static IEnumerable Select(this IEnumerable source, Func selector) - { - return System.Linq.Enumerable.Select(source, selector); - } - - public static IEnumerable> Select(this IEnumerable source, Func> selector) - { - return System.Linq.Enumerable.Select(source, selector); - } - - public static IEnumerable Select(this IEnumerable source, Func selector) - { - return System.Linq.Enumerable.Select(source, selector); - } - - public static IEnumerable> Select(this IEnumerable source, Func> selector) - { - return System.Linq.Enumerable.Select(source, selector); - } - } -} - - diff --git a/VirtueSky/UniTask/Runtime/EnumerableAsyncExtensions.cs.meta b/VirtueSky/UniTask/Runtime/EnumerableAsyncExtensions.cs.meta deleted file mode 100644 index d2e49304..00000000 --- a/VirtueSky/UniTask/Runtime/EnumerableAsyncExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ff50260d74bd54c4b92cf99895549445 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/EnumeratorAsyncExtensions.cs b/VirtueSky/UniTask/Runtime/EnumeratorAsyncExtensions.cs deleted file mode 100644 index 090589cb..00000000 --- a/VirtueSky/UniTask/Runtime/EnumeratorAsyncExtensions.cs +++ /dev/null @@ -1,287 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Collections; -using System.Reflection; -using System.Runtime.ExceptionServices; -using System.Threading; -using VirtueSky.Threading.Tasks.Internal; -using UnityEngine; - -namespace VirtueSky.Threading.Tasks -{ - public static class EnumeratorAsyncExtensions - { - public static UniTask.Awaiter GetAwaiter(this T enumerator) - where T : IEnumerator - { - var e = (IEnumerator)enumerator; - Error.ThrowArgumentNullException(e, nameof(enumerator)); - return new UniTask(EnumeratorPromise.Create(e, PlayerLoopTiming.Update, CancellationToken.None, out var token), token).GetAwaiter(); - } - - public static UniTask WithCancellation(this IEnumerator enumerator, CancellationToken cancellationToken) - { - Error.ThrowArgumentNullException(enumerator, nameof(enumerator)); - return new UniTask(EnumeratorPromise.Create(enumerator, PlayerLoopTiming.Update, cancellationToken, out var token), token); - } - - public static UniTask ToUniTask(this IEnumerator enumerator, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken)) - { - Error.ThrowArgumentNullException(enumerator, nameof(enumerator)); - return new UniTask(EnumeratorPromise.Create(enumerator, timing, cancellationToken, out var token), token); - } - - public static UniTask ToUniTask(this IEnumerator enumerator, MonoBehaviour coroutineRunner) - { - var source = AutoResetUniTaskCompletionSource.Create(); - coroutineRunner.StartCoroutine(Core(enumerator, coroutineRunner, source)); - return source.Task; - } - - static IEnumerator Core(IEnumerator inner, MonoBehaviour coroutineRunner, AutoResetUniTaskCompletionSource source) - { - yield return coroutineRunner.StartCoroutine(inner); - source.TrySetResult(); - } - - sealed class EnumeratorPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode - { - static TaskPool pool; - EnumeratorPromise nextNode; - public ref EnumeratorPromise NextNode => ref nextNode; - - static EnumeratorPromise() - { - TaskPool.RegisterSizeGetter(typeof(EnumeratorPromise), () => pool.Size); - } - - IEnumerator innerEnumerator; - CancellationToken cancellationToken; - int initialFrame; - bool loopRunning; - bool calledGetResult; - - UniTaskCompletionSourceCore core; - - EnumeratorPromise() - { - } - - public static IUniTaskSource Create(IEnumerator innerEnumerator, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new EnumeratorPromise(); - } - TaskTracker.TrackActiveTask(result, 3); - - result.innerEnumerator = ConsumeEnumerator(innerEnumerator); - result.cancellationToken = cancellationToken; - result.loopRunning = true; - result.calledGetResult = false; - result.initialFrame = -1; - - token = result.core.Version; - - // run immediately. - if (result.MoveNext()) - { - PlayerLoopHelper.AddAction(timing, result); - } - - return result; - } - - public void GetResult(short token) - { - try - { - calledGetResult = true; - core.GetResult(token); - } - finally - { - if (!loopRunning) - { - TryReturn(); - } - } - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - if (calledGetResult) - { - loopRunning = false; - TryReturn(); - return false; - } - - if (innerEnumerator == null) // invalid status, returned but loop running? - { - return false; - } - - if (cancellationToken.IsCancellationRequested) - { - loopRunning = false; - core.TrySetCanceled(cancellationToken); - return false; - } - - if (initialFrame == -1) - { - // Time can not touch in threadpool. - if (PlayerLoopHelper.IsMainThread) - { - initialFrame = Time.frameCount; - } - } - else if (initialFrame == Time.frameCount) - { - return true; // already executed in first frame, skip. - } - - try - { - if (innerEnumerator.MoveNext()) - { - return true; - } - } - catch (Exception ex) - { - loopRunning = false; - core.TrySetException(ex); - return false; - } - - loopRunning = false; - core.TrySetResult(null); - return false; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - innerEnumerator = default; - cancellationToken = default; - - return pool.TryPush(this); - } - - // Unwrap YieldInstructions - - static IEnumerator ConsumeEnumerator(IEnumerator enumerator) - { - while (enumerator.MoveNext()) - { - var current = enumerator.Current; - if (current == null) - { - yield return null; - } - else if (current is CustomYieldInstruction cyi) - { - // WWW, WaitForSecondsRealtime - while (cyi.keepWaiting) - { - yield return null; - } - } - else if (current is YieldInstruction) - { - IEnumerator innerCoroutine = null; - switch (current) - { - case AsyncOperation ao: - innerCoroutine = UnwrapWaitAsyncOperation(ao); - break; - case WaitForSeconds wfs: - innerCoroutine = UnwrapWaitForSeconds(wfs); - break; - } - if (innerCoroutine != null) - { - while (innerCoroutine.MoveNext()) - { - yield return null; - } - } - else - { - goto WARN; - } - } - else if (current is IEnumerator e3) - { - var e4 = ConsumeEnumerator(e3); - while (e4.MoveNext()) - { - yield return null; - } - } - else - { - goto WARN; - } - - continue; - - WARN: - // WaitForEndOfFrame, WaitForFixedUpdate, others. - UnityEngine.Debug.LogWarning($"yield {current.GetType().Name} is not supported on await IEnumerator or IEnumerator.ToUniTask(), please use ToUniTask(MonoBehaviour coroutineRunner) instead."); - yield return null; - } - } - - static readonly FieldInfo waitForSeconds_Seconds = typeof(WaitForSeconds).GetField("m_Seconds", BindingFlags.Instance | BindingFlags.GetField | BindingFlags.NonPublic); - - static IEnumerator UnwrapWaitForSeconds(WaitForSeconds waitForSeconds) - { - var second = (float)waitForSeconds_Seconds.GetValue(waitForSeconds); - var elapsed = 0.0f; - while (true) - { - yield return null; - - elapsed += Time.deltaTime; - if (elapsed >= second) - { - break; - } - }; - } - - static IEnumerator UnwrapWaitAsyncOperation(AsyncOperation asyncOperation) - { - while (!asyncOperation.isDone) - { - yield return null; - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/EnumeratorAsyncExtensions.cs.meta b/VirtueSky/UniTask/Runtime/EnumeratorAsyncExtensions.cs.meta deleted file mode 100644 index a07b336d..00000000 --- a/VirtueSky/UniTask/Runtime/EnumeratorAsyncExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: bc661232f11e4a741af54ba1c175d5ee -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/ExceptionExtensions.cs b/VirtueSky/UniTask/Runtime/ExceptionExtensions.cs deleted file mode 100644 index cb91dabf..00000000 --- a/VirtueSky/UniTask/Runtime/ExceptionExtensions.cs +++ /dev/null @@ -1,14 +0,0 @@ - -using System; - -namespace VirtueSky.Threading.Tasks -{ - public static class ExceptionExtensions - { - public static bool IsOperationCanceledException(this Exception exception) - { - return exception is OperationCanceledException; - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/ExceptionExtensions.cs.meta b/VirtueSky/UniTask/Runtime/ExceptionExtensions.cs.meta deleted file mode 100644 index 98330016..00000000 --- a/VirtueSky/UniTask/Runtime/ExceptionExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 930800098504c0d46958ce23a0495202 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/External.meta b/VirtueSky/UniTask/Runtime/External.meta deleted file mode 100644 index e68eb825..00000000 --- a/VirtueSky/UniTask/Runtime/External.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: dc35b6bb19b36134eb557b7051aecc7c -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/External/Addressables.meta b/VirtueSky/UniTask/Runtime/External/Addressables.meta deleted file mode 100644 index 53978727..00000000 --- a/VirtueSky/UniTask/Runtime/External/Addressables.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: eb6f0353f5145d14b8888c9c46f4ff58 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs b/VirtueSky/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs deleted file mode 100644 index 195f87f1..00000000 --- a/VirtueSky/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs +++ /dev/null @@ -1,473 +0,0 @@ -// asmdef Version Defines, enabled when com.unity.addressables is imported. - -#if UNITASK_ADDRESSABLE_SUPPORT - -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Runtime.CompilerServices; -using System.Runtime.ExceptionServices; -using System.Threading; -using UnityEngine.AddressableAssets; -using UnityEngine.ResourceManagement.AsyncOperations; - -namespace VirtueSky.Threading.Tasks -{ - public static class AddressablesAsyncExtensions - { -#region AsyncOperationHandle - - public static UniTask.Awaiter GetAwaiter(this AsyncOperationHandle handle) - { - return ToUniTask(handle).GetAwaiter(); - } - - public static UniTask WithCancellation(this AsyncOperationHandle handle, CancellationToken cancellationToken, bool cancelImmediately = false, bool autoReleaseWhenCanceled = false) - { - return ToUniTask(handle, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately, autoReleaseWhenCanceled: autoReleaseWhenCanceled); - } - - public static UniTask ToUniTask(this AsyncOperationHandle handle, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false, bool autoReleaseWhenCanceled = false) - { - if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken); - - if (!handle.IsValid()) - { - // autoReleaseHandle:true handle is invalid(immediately internal handle == null) so return completed. - return UniTask.CompletedTask; - } - - if (handle.IsDone) - { - if (handle.Status == AsyncOperationStatus.Failed) - { - return UniTask.FromException(handle.OperationException); - } - return UniTask.CompletedTask; - } - - return new UniTask(AsyncOperationHandleConfiguredSource.Create(handle, timing, progress, cancellationToken, cancelImmediately, autoReleaseWhenCanceled, out var token), token); - } - - public struct AsyncOperationHandleAwaiter : ICriticalNotifyCompletion - { - AsyncOperationHandle handle; - Action continuationAction; - - public AsyncOperationHandleAwaiter(AsyncOperationHandle handle) - { - this.handle = handle; - this.continuationAction = null; - } - - public bool IsCompleted => handle.IsDone; - - public void GetResult() - { - if (continuationAction != null) - { - handle.Completed -= continuationAction; - continuationAction = null; - } - - if (handle.Status == AsyncOperationStatus.Failed) - { - var e = handle.OperationException; - handle = default; - ExceptionDispatchInfo.Capture(e).Throw(); - } - - var result = handle.Result; - handle = default; - } - - public void OnCompleted(Action continuation) - { - UnsafeOnCompleted(continuation); - } - - public void UnsafeOnCompleted(Action continuation) - { - Error.ThrowWhenContinuationIsAlreadyRegistered(continuationAction); - continuationAction = PooledDelegate.Create(continuation); - handle.Completed += continuationAction; - } - } - - sealed class AsyncOperationHandleConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode - { - static TaskPool pool; - AsyncOperationHandleConfiguredSource nextNode; - public ref AsyncOperationHandleConfiguredSource NextNode => ref nextNode; - - static AsyncOperationHandleConfiguredSource() - { - TaskPool.RegisterSizeGetter(typeof(AsyncOperationHandleConfiguredSource), () => pool.Size); - } - - readonly Action completedCallback; - AsyncOperationHandle handle; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - IProgress progress; - bool autoReleaseWhenCanceled; - bool cancelImmediately; - bool completed; - - UniTaskCompletionSourceCore core; - - AsyncOperationHandleConfiguredSource() - { - completedCallback = HandleCompleted; - } - - public static IUniTaskSource Create(AsyncOperationHandle handle, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, bool cancelImmediately, bool autoReleaseWhenCanceled, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new AsyncOperationHandleConfiguredSource(); - } - - result.handle = handle; - result.progress = progress; - result.cancellationToken = cancellationToken; - result.cancelImmediately = cancelImmediately; - result.autoReleaseWhenCanceled = autoReleaseWhenCanceled; - result.completed = false; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var promise = (AsyncOperationHandleConfiguredSource)state; - if (promise.autoReleaseWhenCanceled && promise.handle.IsValid()) - { - Addressables.Release(promise.handle); - } - promise.core.TrySetCanceled(promise.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - handle.Completed += result.completedCallback; - - token = result.core.Version; - return result; - } - - void HandleCompleted(AsyncOperationHandle _) - { - if (handle.IsValid()) - { - handle.Completed -= completedCallback; - } - - if (completed) - { - return; - } - - completed = true; - if (cancellationToken.IsCancellationRequested) - { - if (autoReleaseWhenCanceled && handle.IsValid()) - { - Addressables.Release(handle); - } - core.TrySetCanceled(cancellationToken); - } - else if (handle.Status == AsyncOperationStatus.Failed) - { - core.TrySetException(handle.OperationException); - } - else - { - core.TrySetResult(AsyncUnit.Default); - } - } - - public void GetResult(short token) - { - try - { - core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - if (completed) - { - return false; - } - - if (cancellationToken.IsCancellationRequested) - { - completed = true; - if (autoReleaseWhenCanceled && handle.IsValid()) - { - Addressables.Release(handle); - } - core.TrySetCanceled(cancellationToken); - return false; - } - - if (progress != null && handle.IsValid()) - { - progress.Report(handle.PercentComplete); - } - - return true; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - handle = default; - progress = default; - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - return pool.TryPush(this); - } - } - -#endregion - -#region AsyncOperationHandle_T - - public static UniTask.Awaiter GetAwaiter(this AsyncOperationHandle handle) - { - return ToUniTask(handle).GetAwaiter(); - } - - public static UniTask WithCancellation(this AsyncOperationHandle handle, CancellationToken cancellationToken, bool cancelImmediately = false, bool autoReleaseWhenCanceled = false) - { - return ToUniTask(handle, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately, autoReleaseWhenCanceled: autoReleaseWhenCanceled); - } - - public static UniTask ToUniTask(this AsyncOperationHandle handle, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false, bool autoReleaseWhenCanceled = false) - { - if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken); - - if (!handle.IsValid()) - { - throw new Exception("Attempting to use an invalid operation handle"); - } - - if (handle.IsDone) - { - if (handle.Status == AsyncOperationStatus.Failed) - { - return UniTask.FromException(handle.OperationException); - } - return UniTask.FromResult(handle.Result); - } - - return new UniTask(AsyncOperationHandleConfiguredSource.Create(handle, timing, progress, cancellationToken, cancelImmediately, autoReleaseWhenCanceled, out var token), token); - } - - sealed class AsyncOperationHandleConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode> - { - static TaskPool> pool; - AsyncOperationHandleConfiguredSource nextNode; - public ref AsyncOperationHandleConfiguredSource NextNode => ref nextNode; - - static AsyncOperationHandleConfiguredSource() - { - TaskPool.RegisterSizeGetter(typeof(AsyncOperationHandleConfiguredSource), () => pool.Size); - } - - readonly Action> completedCallback; - AsyncOperationHandle handle; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - IProgress progress; - bool autoReleaseWhenCanceled; - bool cancelImmediately; - bool completed; - - UniTaskCompletionSourceCore core; - - AsyncOperationHandleConfiguredSource() - { - completedCallback = HandleCompleted; - } - - public static IUniTaskSource Create(AsyncOperationHandle handle, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, bool cancelImmediately, bool autoReleaseWhenCanceled, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new AsyncOperationHandleConfiguredSource(); - } - - result.handle = handle; - result.cancellationToken = cancellationToken; - result.completed = false; - result.progress = progress; - result.autoReleaseWhenCanceled = autoReleaseWhenCanceled; - result.cancelImmediately = cancelImmediately; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var promise = (AsyncOperationHandleConfiguredSource)state; - if (promise.autoReleaseWhenCanceled && promise.handle.IsValid()) - { - Addressables.Release(promise.handle); - } - promise.core.TrySetCanceled(promise.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - handle.Completed += result.completedCallback; - - token = result.core.Version; - return result; - } - - void HandleCompleted(AsyncOperationHandle argHandle) - { - if (handle.IsValid()) - { - handle.Completed -= completedCallback; - } - - if (completed) - { - return; - } - completed = true; - if (cancellationToken.IsCancellationRequested) - { - if (autoReleaseWhenCanceled && handle.IsValid()) - { - Addressables.Release(handle); - } - core.TrySetCanceled(cancellationToken); - } - else if (argHandle.Status == AsyncOperationStatus.Failed) - { - core.TrySetException(argHandle.OperationException); - } - else - { - core.TrySetResult(argHandle.Result); - } - } - - public T GetResult(short token) - { - try - { - return core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - TryReturn(); - } - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - if (completed) - { - return false; - } - - if (cancellationToken.IsCancellationRequested) - { - completed = true; - if (autoReleaseWhenCanceled && handle.IsValid()) - { - Addressables.Release(handle); - } - core.TrySetCanceled(cancellationToken); - return false; - } - - if (progress != null && handle.IsValid()) - { - progress.Report(handle.PercentComplete); - } - - return true; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - handle = default; - progress = default; - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - return pool.TryPush(this); - } - } - -#endregion - } -} - -#endif \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs.meta b/VirtueSky/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs.meta deleted file mode 100644 index 6927930d..00000000 --- a/VirtueSky/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3dc6441f9094f354b931dc3c79fb99e5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/External/DOTween.meta b/VirtueSky/UniTask/Runtime/External/DOTween.meta deleted file mode 100644 index 2c241137..00000000 --- a/VirtueSky/UniTask/Runtime/External/DOTween.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: b3c55fb14755cfd46bcf65e8dd1d4217 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs b/VirtueSky/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs deleted file mode 100644 index 271907e3..00000000 --- a/VirtueSky/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs +++ /dev/null @@ -1,436 +0,0 @@ -// asmdef Version Defines, enabled when com.demigiant.dotween is imported. - -#if UNITASK_DOTWEEN_SUPPORT - -using VirtueSky.Threading.Tasks.Internal; -using DG.Tweening; -using System; -using System.Collections.Concurrent; -using System.Runtime.CompilerServices; -using System.Threading; - -namespace VirtueSky.Threading.Tasks -{ - public enum TweenCancelBehaviour - { - Kill, - KillWithCompleteCallback, - Complete, - CompleteWithSequenceCallback, - CancelAwait, - - // AndCancelAwait - KillAndCancelAwait, - KillWithCompleteCallbackAndCancelAwait, - CompleteAndCancelAwait, - CompleteWithSequenceCallbackAndCancelAwait - } - - public static class DOTweenAsyncExtensions - { - enum CallbackType - { - Kill, - Complete, - Pause, - Play, - Rewind, - StepComplete - } - - public static TweenAwaiter GetAwaiter(this Tween tween) - { - return new TweenAwaiter(tween); - } - - public static UniTask WithCancellation(this Tween tween, CancellationToken cancellationToken) - { - Error.ThrowArgumentNullException(tween, nameof(tween)); - - if (!tween.IsActive()) return UniTask.CompletedTask; - return new UniTask(TweenConfiguredSource.Create(tween, TweenCancelBehaviour.Kill, cancellationToken, CallbackType.Kill, out var token), token); - } - - public static UniTask ToUniTask(this Tween tween, TweenCancelBehaviour tweenCancelBehaviour = TweenCancelBehaviour.Kill, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(tween, nameof(tween)); - - if (!tween.IsActive()) return UniTask.CompletedTask; - return new UniTask(TweenConfiguredSource.Create(tween, tweenCancelBehaviour, cancellationToken, CallbackType.Kill, out var token), token); - } - - public static UniTask AwaitForComplete(this Tween tween, TweenCancelBehaviour tweenCancelBehaviour = TweenCancelBehaviour.Kill, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(tween, nameof(tween)); - - if (!tween.IsActive()) return UniTask.CompletedTask; - return new UniTask(TweenConfiguredSource.Create(tween, tweenCancelBehaviour, cancellationToken, CallbackType.Complete, out var token), token); - } - - public static UniTask AwaitForPause(this Tween tween, TweenCancelBehaviour tweenCancelBehaviour = TweenCancelBehaviour.Kill, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(tween, nameof(tween)); - - if (!tween.IsActive()) return UniTask.CompletedTask; - return new UniTask(TweenConfiguredSource.Create(tween, tweenCancelBehaviour, cancellationToken, CallbackType.Pause, out var token), token); - } - - public static UniTask AwaitForPlay(this Tween tween, TweenCancelBehaviour tweenCancelBehaviour = TweenCancelBehaviour.Kill, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(tween, nameof(tween)); - - if (!tween.IsActive()) return UniTask.CompletedTask; - return new UniTask(TweenConfiguredSource.Create(tween, tweenCancelBehaviour, cancellationToken, CallbackType.Play, out var token), token); - } - - public static UniTask AwaitForRewind(this Tween tween, TweenCancelBehaviour tweenCancelBehaviour = TweenCancelBehaviour.Kill, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(tween, nameof(tween)); - - if (!tween.IsActive()) return UniTask.CompletedTask; - return new UniTask(TweenConfiguredSource.Create(tween, tweenCancelBehaviour, cancellationToken, CallbackType.Rewind, out var token), token); - } - - public static UniTask AwaitForStepComplete(this Tween tween, TweenCancelBehaviour tweenCancelBehaviour = TweenCancelBehaviour.Kill, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(tween, nameof(tween)); - - if (!tween.IsActive()) return UniTask.CompletedTask; - return new UniTask(TweenConfiguredSource.Create(tween, tweenCancelBehaviour, cancellationToken, CallbackType.StepComplete, out var token), token); - } - - public struct TweenAwaiter : ICriticalNotifyCompletion - { - readonly Tween tween; - - // killed(non active) as completed. - public bool IsCompleted => !tween.IsActive(); - - public TweenAwaiter(Tween tween) - { - this.tween = tween; - } - - public TweenAwaiter GetAwaiter() - { - return this; - } - - public void GetResult() - { - } - - public void OnCompleted(System.Action continuation) - { - UnsafeOnCompleted(continuation); - } - - public void UnsafeOnCompleted(System.Action continuation) - { - // onKill is called after OnCompleted, both Complete(false/true) and Kill(false/true). - tween.onKill = PooledTweenCallback.Create(continuation); - } - } - - sealed class TweenConfiguredSource : IUniTaskSource, ITaskPoolNode - { - static TaskPool pool; - TweenConfiguredSource nextNode; - public ref TweenConfiguredSource NextNode => ref nextNode; - - static TweenConfiguredSource() - { - TaskPool.RegisterSizeGetter(typeof(TweenConfiguredSource), () => pool.Size); - } - - readonly TweenCallback onCompleteCallbackDelegate; - - Tween tween; - TweenCancelBehaviour cancelBehaviour; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationRegistration; - CallbackType callbackType; - bool canceled; - - TweenCallback originalCompleteAction; - UniTaskCompletionSourceCore core; - - TweenConfiguredSource() - { - onCompleteCallbackDelegate = OnCompleteCallbackDelegate; - } - - public static IUniTaskSource Create(Tween tween, TweenCancelBehaviour cancelBehaviour, CancellationToken cancellationToken, CallbackType callbackType, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - DoCancelBeforeCreate(tween, cancelBehaviour); - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new TweenConfiguredSource(); - } - - result.tween = tween; - result.cancelBehaviour = cancelBehaviour; - result.cancellationToken = cancellationToken; - result.callbackType = callbackType; - result.canceled = false; - - switch (callbackType) - { - case CallbackType.Kill: - result.originalCompleteAction = tween.onKill; - tween.onKill = result.onCompleteCallbackDelegate; - break; - case CallbackType.Complete: - result.originalCompleteAction = tween.onComplete; - tween.onComplete = result.onCompleteCallbackDelegate; - break; - case CallbackType.Pause: - result.originalCompleteAction = tween.onPause; - tween.onPause = result.onCompleteCallbackDelegate; - break; - case CallbackType.Play: - result.originalCompleteAction = tween.onPlay; - tween.onPlay = result.onCompleteCallbackDelegate; - break; - case CallbackType.Rewind: - result.originalCompleteAction = tween.onRewind; - tween.onRewind = result.onCompleteCallbackDelegate; - break; - case CallbackType.StepComplete: - result.originalCompleteAction = tween.onStepComplete; - tween.onStepComplete = result.onCompleteCallbackDelegate; - break; - default: - break; - } - - if (result.originalCompleteAction == result.onCompleteCallbackDelegate) - { - result.originalCompleteAction = null; - } - - if (cancellationToken.CanBeCanceled) - { - result.cancellationRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(x => - { - var source = (TweenConfiguredSource)x; - switch (source.cancelBehaviour) - { - case TweenCancelBehaviour.Kill: - default: - source.tween.Kill(false); - break; - case TweenCancelBehaviour.KillAndCancelAwait: - source.canceled = true; - source.tween.Kill(false); - break; - case TweenCancelBehaviour.KillWithCompleteCallback: - source.tween.Kill(true); - break; - case TweenCancelBehaviour.KillWithCompleteCallbackAndCancelAwait: - source.canceled = true; - source.tween.Kill(true); - break; - case TweenCancelBehaviour.Complete: - source.tween.Complete(false); - break; - case TweenCancelBehaviour.CompleteAndCancelAwait: - source.canceled = true; - source.tween.Complete(false); - break; - case TweenCancelBehaviour.CompleteWithSequenceCallback: - source.tween.Complete(true); - break; - case TweenCancelBehaviour.CompleteWithSequenceCallbackAndCancelAwait: - source.canceled = true; - source.tween.Complete(true); - break; - case TweenCancelBehaviour.CancelAwait: - source.RestoreOriginalCallback(); - source.core.TrySetCanceled(source.cancellationToken); - break; - } - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - token = result.core.Version; - return result; - } - - void OnCompleteCallbackDelegate() - { - if (cancellationToken.IsCancellationRequested) - { - if (this.cancelBehaviour == TweenCancelBehaviour.KillAndCancelAwait - || this.cancelBehaviour == TweenCancelBehaviour.KillWithCompleteCallbackAndCancelAwait - || this.cancelBehaviour == TweenCancelBehaviour.CompleteAndCancelAwait - || this.cancelBehaviour == TweenCancelBehaviour.CompleteWithSequenceCallbackAndCancelAwait - || this.cancelBehaviour == TweenCancelBehaviour.CancelAwait) - { - canceled = true; - } - } - if (canceled) - { - core.TrySetCanceled(cancellationToken); - } - else - { - originalCompleteAction?.Invoke(); - core.TrySetResult(AsyncUnit.Default); - } - } - - static void DoCancelBeforeCreate(Tween tween, TweenCancelBehaviour tweenCancelBehaviour) - { - - switch (tweenCancelBehaviour) - { - case TweenCancelBehaviour.Kill: - default: - tween.Kill(false); - break; - case TweenCancelBehaviour.KillAndCancelAwait: - tween.Kill(false); - break; - case TweenCancelBehaviour.KillWithCompleteCallback: - tween.Kill(true); - break; - case TweenCancelBehaviour.KillWithCompleteCallbackAndCancelAwait: - tween.Kill(true); - break; - case TweenCancelBehaviour.Complete: - tween.Complete(false); - break; - case TweenCancelBehaviour.CompleteAndCancelAwait: - tween.Complete(false); - break; - case TweenCancelBehaviour.CompleteWithSequenceCallback: - tween.Complete(true); - break; - case TweenCancelBehaviour.CompleteWithSequenceCallbackAndCancelAwait: - tween.Complete(true); - break; - case TweenCancelBehaviour.CancelAwait: - break; - } - } - - public void GetResult(short token) - { - try - { - core.GetResult(token); - } - finally - { - TryReturn(); - } - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - cancellationRegistration.Dispose(); - - RestoreOriginalCallback(); - - tween = default; - cancellationToken = default; - originalCompleteAction = default; - return pool.TryPush(this); - } - - void RestoreOriginalCallback() - { - switch (callbackType) - { - case CallbackType.Kill: - tween.onKill = originalCompleteAction; - break; - case CallbackType.Complete: - tween.onComplete = originalCompleteAction; - break; - case CallbackType.Pause: - tween.onPause = originalCompleteAction; - break; - case CallbackType.Play: - tween.onPlay = originalCompleteAction; - break; - case CallbackType.Rewind: - tween.onRewind = originalCompleteAction; - break; - case CallbackType.StepComplete: - tween.onStepComplete = originalCompleteAction; - break; - default: - break; - } - } - } - } - - sealed class PooledTweenCallback - { - static readonly ConcurrentQueue pool = new ConcurrentQueue(); - - readonly TweenCallback runDelegate; - - Action continuation; - - - PooledTweenCallback() - { - runDelegate = Run; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TweenCallback Create(Action continuation) - { - if (!pool.TryDequeue(out var item)) - { - item = new PooledTweenCallback(); - } - - item.continuation = continuation; - return item.runDelegate; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - void Run() - { - var call = continuation; - continuation = null; - if (call != null) - { - pool.Enqueue(this); - call.Invoke(); - } - } - } -} - -#endif diff --git a/VirtueSky/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs.meta b/VirtueSky/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs.meta deleted file mode 100644 index 63131b04..00000000 --- a/VirtueSky/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1f448d5bc5b232e4f98d89d5d1832e8e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/External/TextMeshPro.meta b/VirtueSky/UniTask/Runtime/External/TextMeshPro.meta deleted file mode 100644 index a294d0f7..00000000 --- a/VirtueSky/UniTask/Runtime/External/TextMeshPro.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 4ebc7a8372f71de41a9244e238d22411 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.InputField.cs b/VirtueSky/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.InputField.cs deleted file mode 100644 index 3bbaf846..00000000 --- a/VirtueSky/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.InputField.cs +++ /dev/null @@ -1,224 +0,0 @@ -#if UNITASK_TEXTMESHPRO_SUPPORT - -using System; -using System.Threading; -using TMPro; - -namespace VirtueSky.Threading.Tasks -{ - public static partial class TextMeshProAsyncExtensions - { - public static IAsyncValueChangedEventHandler GetAsyncValueChangedEventHandler(this TMP_InputField inputField) - { - return new AsyncUnityEventHandler(inputField.onValueChanged, inputField.GetCancellationTokenOnDestroy(), false); - } - - public static IAsyncValueChangedEventHandler GetAsyncValueChangedEventHandler(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(inputField.onValueChanged, cancellationToken, false); - } - - public static UniTask OnValueChangedAsync(this TMP_InputField inputField) - { - return new AsyncUnityEventHandler(inputField.onValueChanged, inputField.GetCancellationTokenOnDestroy(), true).OnInvokeAsync(); - } - - public static UniTask OnValueChangedAsync(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(inputField.onValueChanged, cancellationToken, true).OnInvokeAsync(); - } - - public static IUniTaskAsyncEnumerable OnValueChangedAsAsyncEnumerable(this TMP_InputField inputField) - { - return new UnityEventHandlerAsyncEnumerable(inputField.onValueChanged, inputField.GetCancellationTokenOnDestroy()); - } - - public static IUniTaskAsyncEnumerable OnValueChangedAsAsyncEnumerable(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new UnityEventHandlerAsyncEnumerable(inputField.onValueChanged, cancellationToken); - } - - public static IAsyncEndEditEventHandler GetAsyncEndEditEventHandler(this TMP_InputField inputField) - { - return new AsyncUnityEventHandler(inputField.onEndEdit, inputField.GetCancellationTokenOnDestroy(), false); - } - - public static IAsyncEndEditEventHandler GetAsyncEndEditEventHandler(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(inputField.onEndEdit, cancellationToken, false); - } - - public static UniTask OnEndEditAsync(this TMP_InputField inputField) - { - return new AsyncUnityEventHandler(inputField.onEndEdit, inputField.GetCancellationTokenOnDestroy(), true).OnInvokeAsync(); - } - - public static UniTask OnEndEditAsync(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(inputField.onEndEdit, cancellationToken, true).OnInvokeAsync(); - } - - public static IUniTaskAsyncEnumerable OnEndEditAsAsyncEnumerable(this TMP_InputField inputField) - { - return new UnityEventHandlerAsyncEnumerable(inputField.onEndEdit, inputField.GetCancellationTokenOnDestroy()); - } - - public static IUniTaskAsyncEnumerable OnEndEditAsAsyncEnumerable(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new UnityEventHandlerAsyncEnumerable(inputField.onEndEdit, cancellationToken); - } - - public static IAsyncEndTextSelectionEventHandler<(string, int, int)> GetAsyncEndTextSelectionEventHandler(this TMP_InputField inputField) - { - return new AsyncUnityEventHandler<(string, int, int)>(new TextSelectionEventConverter(inputField.onEndTextSelection), inputField.GetCancellationTokenOnDestroy(), false); - } - - public static IAsyncEndTextSelectionEventHandler<(string, int, int)> GetAsyncEndTextSelectionEventHandler(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler<(string, int, int)>(new TextSelectionEventConverter(inputField.onEndTextSelection), cancellationToken, false); - } - - public static UniTask<(string, int, int)> OnEndTextSelectionAsync(this TMP_InputField inputField) - { - return new AsyncUnityEventHandler<(string, int, int)>(new TextSelectionEventConverter(inputField.onEndTextSelection), inputField.GetCancellationTokenOnDestroy(), true).OnInvokeAsync(); - } - - public static UniTask<(string, int, int)> OnEndTextSelectionAsync(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler<(string, int, int)>(new TextSelectionEventConverter(inputField.onEndTextSelection), cancellationToken, true).OnInvokeAsync(); - } - - public static IUniTaskAsyncEnumerable<(string, int, int)> OnEndTextSelectionAsAsyncEnumerable(this TMP_InputField inputField) - { - return new UnityEventHandlerAsyncEnumerable<(string, int, int)>(new TextSelectionEventConverter(inputField.onEndTextSelection), inputField.GetCancellationTokenOnDestroy()); - } - - public static IUniTaskAsyncEnumerable<(string, int, int)> OnEndTextSelectionAsAsyncEnumerable(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new UnityEventHandlerAsyncEnumerable<(string, int, int)>(new TextSelectionEventConverter(inputField.onEndTextSelection), cancellationToken); - } - - public static IAsyncTextSelectionEventHandler<(string, int, int)> GetAsyncTextSelectionEventHandler(this TMP_InputField inputField) - { - return new AsyncUnityEventHandler<(string, int, int)>(new TextSelectionEventConverter(inputField.onTextSelection), inputField.GetCancellationTokenOnDestroy(), false); - } - - public static IAsyncTextSelectionEventHandler<(string, int, int)> GetAsyncTextSelectionEventHandler(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler<(string, int, int)>(new TextSelectionEventConverter(inputField.onTextSelection), cancellationToken, false); - } - - public static UniTask<(string, int, int)> OnTextSelectionAsync(this TMP_InputField inputField) - { - return new AsyncUnityEventHandler<(string, int, int)>(new TextSelectionEventConverter(inputField.onTextSelection), inputField.GetCancellationTokenOnDestroy(), true).OnInvokeAsync(); - } - - public static UniTask<(string, int, int)> OnTextSelectionAsync(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler<(string, int, int)>(new TextSelectionEventConverter(inputField.onTextSelection), cancellationToken, true).OnInvokeAsync(); - } - - public static IUniTaskAsyncEnumerable<(string, int, int)> OnTextSelectionAsAsyncEnumerable(this TMP_InputField inputField) - { - return new UnityEventHandlerAsyncEnumerable<(string, int, int)>(new TextSelectionEventConverter(inputField.onTextSelection), inputField.GetCancellationTokenOnDestroy()); - } - - public static IUniTaskAsyncEnumerable<(string, int, int)> OnTextSelectionAsAsyncEnumerable(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new UnityEventHandlerAsyncEnumerable<(string, int, int)>(new TextSelectionEventConverter(inputField.onTextSelection), cancellationToken); - } - - public static IAsyncDeselectEventHandler GetAsyncDeselectEventHandler(this TMP_InputField inputField) - { - return new AsyncUnityEventHandler(inputField.onDeselect, inputField.GetCancellationTokenOnDestroy(), false); - } - - public static IAsyncDeselectEventHandler GetAsyncDeselectEventHandler(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(inputField.onDeselect, cancellationToken, false); - } - - public static UniTask OnDeselectAsync(this TMP_InputField inputField) - { - return new AsyncUnityEventHandler(inputField.onDeselect, inputField.GetCancellationTokenOnDestroy(), true).OnInvokeAsync(); - } - - public static UniTask OnDeselectAsync(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(inputField.onDeselect, cancellationToken, true).OnInvokeAsync(); - } - - public static IUniTaskAsyncEnumerable OnDeselectAsAsyncEnumerable(this TMP_InputField inputField) - { - return new UnityEventHandlerAsyncEnumerable(inputField.onDeselect, inputField.GetCancellationTokenOnDestroy()); - } - - public static IUniTaskAsyncEnumerable OnDeselectAsAsyncEnumerable(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new UnityEventHandlerAsyncEnumerable(inputField.onDeselect, cancellationToken); - } - - public static IAsyncSelectEventHandler GetAsyncSelectEventHandler(this TMP_InputField inputField) - { - return new AsyncUnityEventHandler(inputField.onSelect, inputField.GetCancellationTokenOnDestroy(), false); - } - - public static IAsyncSelectEventHandler GetAsyncSelectEventHandler(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(inputField.onSelect, cancellationToken, false); - } - - public static UniTask OnSelectAsync(this TMP_InputField inputField) - { - return new AsyncUnityEventHandler(inputField.onSelect, inputField.GetCancellationTokenOnDestroy(), true).OnInvokeAsync(); - } - - public static UniTask OnSelectAsync(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(inputField.onSelect, cancellationToken, true).OnInvokeAsync(); - } - - public static IUniTaskAsyncEnumerable OnSelectAsAsyncEnumerable(this TMP_InputField inputField) - { - return new UnityEventHandlerAsyncEnumerable(inputField.onSelect, inputField.GetCancellationTokenOnDestroy()); - } - - public static IUniTaskAsyncEnumerable OnSelectAsAsyncEnumerable(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new UnityEventHandlerAsyncEnumerable(inputField.onSelect, cancellationToken); - } - - public static IAsyncSubmitEventHandler GetAsyncSubmitEventHandler(this TMP_InputField inputField) - { - return new AsyncUnityEventHandler(inputField.onSubmit, inputField.GetCancellationTokenOnDestroy(), false); - } - - public static IAsyncSubmitEventHandler GetAsyncSubmitEventHandler(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(inputField.onSubmit, cancellationToken, false); - } - - public static UniTask OnSubmitAsync(this TMP_InputField inputField) - { - return new AsyncUnityEventHandler(inputField.onSubmit, inputField.GetCancellationTokenOnDestroy(), true).OnInvokeAsync(); - } - - public static UniTask OnSubmitAsync(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(inputField.onSubmit, cancellationToken, true).OnInvokeAsync(); - } - - public static IUniTaskAsyncEnumerable OnSubmitAsAsyncEnumerable(this TMP_InputField inputField) - { - return new UnityEventHandlerAsyncEnumerable(inputField.onSubmit, inputField.GetCancellationTokenOnDestroy()); - } - - public static IUniTaskAsyncEnumerable OnSubmitAsAsyncEnumerable(this TMP_InputField inputField, CancellationToken cancellationToken) - { - return new UnityEventHandlerAsyncEnumerable(inputField.onSubmit, cancellationToken); - } - - } -} - -#endif \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.InputField.cs.meta b/VirtueSky/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.InputField.cs.meta deleted file mode 100644 index 2e39d2e8..00000000 --- a/VirtueSky/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.InputField.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 79f4f2475e0b2c44e97ed1dee760627b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.cs b/VirtueSky/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.cs deleted file mode 100644 index f955253b..00000000 --- a/VirtueSky/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.cs +++ /dev/null @@ -1,130 +0,0 @@ -#if UNITASK_TEXTMESHPRO_SUPPORT - -using System; -using System.Threading; -using TMPro; -using UnityEngine.Events; - -namespace VirtueSky.Threading.Tasks -{ - public static partial class TextMeshProAsyncExtensions - { - // -> Text - public static void BindTo(this IUniTaskAsyncEnumerable source, TMP_Text text, bool rebindOnError = true) - { - BindToCore(source, text, text.GetCancellationTokenOnDestroy(), rebindOnError).Forget(); - } - - public static void BindTo(this IUniTaskAsyncEnumerable source, TMP_Text text, CancellationToken cancellationToken, bool rebindOnError = true) - { - BindToCore(source, text, cancellationToken, rebindOnError).Forget(); - } - - static async UniTaskVoid BindToCore(IUniTaskAsyncEnumerable source, TMP_Text text, CancellationToken cancellationToken, bool rebindOnError) - { - var repeat = false; - BIND_AGAIN: - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (true) - { - bool moveNext; - try - { - moveNext = await e.MoveNextAsync(); - repeat = false; - } - catch (Exception ex) - { - if (ex is OperationCanceledException) return; - - if (rebindOnError && !repeat) - { - repeat = true; - goto BIND_AGAIN; - } - else - { - throw; - } - } - - if (!moveNext) return; - - text.text = e.Current; - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - // -> Text - - public static void BindTo(this IUniTaskAsyncEnumerable source, TMP_Text text, bool rebindOnError = true) - { - BindToCore(source, text, text.GetCancellationTokenOnDestroy(), rebindOnError).Forget(); - } - - public static void BindTo(this IUniTaskAsyncEnumerable source, TMP_Text text, CancellationToken cancellationToken, bool rebindOnError = true) - { - BindToCore(source, text, cancellationToken, rebindOnError).Forget(); - } - - public static void BindTo(this AsyncReactiveProperty source, TMP_Text text, bool rebindOnError = true) - { - BindToCore(source, text, text.GetCancellationTokenOnDestroy(), rebindOnError).Forget(); - } - - static async UniTaskVoid BindToCore(IUniTaskAsyncEnumerable source, TMP_Text text, CancellationToken cancellationToken, bool rebindOnError) - { - var repeat = false; - BIND_AGAIN: - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (true) - { - bool moveNext; - try - { - moveNext = await e.MoveNextAsync(); - repeat = false; - } - catch (Exception ex) - { - if (ex is OperationCanceledException) return; - - if (rebindOnError && !repeat) - { - repeat = true; - goto BIND_AGAIN; - } - else - { - throw; - } - } - - if (!moveNext) return; - - text.text = e.Current.ToString(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - } -} - -#endif \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.cs.meta b/VirtueSky/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.cs.meta deleted file mode 100644 index 752d125c..00000000 --- a/VirtueSky/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b6ba480edafb67d4e91bb10feb64fae5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/IUniTaskAsyncEnumerable.cs b/VirtueSky/UniTask/Runtime/IUniTaskAsyncEnumerable.cs deleted file mode 100644 index d2739016..00000000 --- a/VirtueSky/UniTask/Runtime/IUniTaskAsyncEnumerable.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using System.Threading; - -namespace VirtueSky.Threading.Tasks -{ - public interface IUniTaskAsyncEnumerable - { - IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default); - } - - public interface IUniTaskAsyncEnumerator : IUniTaskAsyncDisposable - { - T Current { get; } - UniTask MoveNextAsync(); - } - - public interface IUniTaskAsyncDisposable - { - UniTask DisposeAsync(); - } - - public interface IUniTaskOrderedAsyncEnumerable : IUniTaskAsyncEnumerable - { - IUniTaskOrderedAsyncEnumerable CreateOrderedEnumerable(Func keySelector, IComparer comparer, bool descending); - IUniTaskOrderedAsyncEnumerable CreateOrderedEnumerable(Func> keySelector, IComparer comparer, bool descending); - IUniTaskOrderedAsyncEnumerable CreateOrderedEnumerable(Func> keySelector, IComparer comparer, bool descending); - } - - public interface IConnectableUniTaskAsyncEnumerable : IUniTaskAsyncEnumerable - { - IDisposable Connect(); - } - - // don't use AsyncGrouping. - //public interface IUniTaskAsyncGrouping : IUniTaskAsyncEnumerable - //{ - // TKey Key { get; } - //} - - public static class UniTaskAsyncEnumerableExtensions - { - public static UniTaskCancelableAsyncEnumerable WithCancellation(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - return new UniTaskCancelableAsyncEnumerable(source, cancellationToken); - } - } - - [StructLayout(LayoutKind.Auto)] - public readonly struct UniTaskCancelableAsyncEnumerable - { - private readonly IUniTaskAsyncEnumerable enumerable; - private readonly CancellationToken cancellationToken; - - internal UniTaskCancelableAsyncEnumerable(IUniTaskAsyncEnumerable enumerable, CancellationToken cancellationToken) - { - this.enumerable = enumerable; - this.cancellationToken = cancellationToken; - } - - public Enumerator GetAsyncEnumerator() - { - return new Enumerator(enumerable.GetAsyncEnumerator(cancellationToken)); - } - - [StructLayout(LayoutKind.Auto)] - public readonly struct Enumerator - { - private readonly IUniTaskAsyncEnumerator enumerator; - - internal Enumerator(IUniTaskAsyncEnumerator enumerator) - { - this.enumerator = enumerator; - } - - public T Current => enumerator.Current; - - public UniTask MoveNextAsync() - { - return enumerator.MoveNextAsync(); - } - - - public UniTask DisposeAsync() - { - return enumerator.DisposeAsync(); - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/IUniTaskAsyncEnumerable.cs.meta b/VirtueSky/UniTask/Runtime/IUniTaskAsyncEnumerable.cs.meta deleted file mode 100644 index 12f0fe52..00000000 --- a/VirtueSky/UniTask/Runtime/IUniTaskAsyncEnumerable.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b20cf9f02ac585948a4372fa4ee06504 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/IUniTaskSource.cs b/VirtueSky/UniTask/Runtime/IUniTaskSource.cs deleted file mode 100644 index 42fc5d56..00000000 --- a/VirtueSky/UniTask/Runtime/IUniTaskSource.cs +++ /dev/null @@ -1,127 +0,0 @@ -#pragma warning disable CS1591 -#pragma warning disable CS0108 - -#if (UNITASK_NETCORE && !NETSTANDARD2_0) || UNITY_2022_3_OR_NEWER -#define SUPPORT_VALUETASK -#endif - -using System; -using System.Runtime.CompilerServices; - -namespace VirtueSky.Threading.Tasks -{ - public enum UniTaskStatus - { - /// The operation has not yet completed. - Pending = 0, - /// The operation completed successfully. - Succeeded = 1, - /// The operation completed with an error. - Faulted = 2, - /// The operation completed due to cancellation. - Canceled = 3 - } - - // similar as IValueTaskSource - public interface IUniTaskSource -#if SUPPORT_VALUETASK - : System.Threading.Tasks.Sources.IValueTaskSource -#endif - { - UniTaskStatus GetStatus(short token); - void OnCompleted(Action continuation, object state, short token); - void GetResult(short token); - - UniTaskStatus UnsafeGetStatus(); // only for debug use. - -#if SUPPORT_VALUETASK - - System.Threading.Tasks.Sources.ValueTaskSourceStatus System.Threading.Tasks.Sources.IValueTaskSource.GetStatus(short token) - { - return (System.Threading.Tasks.Sources.ValueTaskSourceStatus)(int)((IUniTaskSource)this).GetStatus(token); - } - - void System.Threading.Tasks.Sources.IValueTaskSource.GetResult(short token) - { - ((IUniTaskSource)this).GetResult(token); - } - - void System.Threading.Tasks.Sources.IValueTaskSource.OnCompleted(Action continuation, object state, short token, System.Threading.Tasks.Sources.ValueTaskSourceOnCompletedFlags flags) - { - // ignore flags, always none. - ((IUniTaskSource)this).OnCompleted(continuation, state, token); - } - -#endif - } - - public interface IUniTaskSource : IUniTaskSource -#if SUPPORT_VALUETASK - , System.Threading.Tasks.Sources.IValueTaskSource -#endif - { - new T GetResult(short token); - -#if SUPPORT_VALUETASK - - new public UniTaskStatus GetStatus(short token) - { - return ((IUniTaskSource)this).GetStatus(token); - } - - new public void OnCompleted(Action continuation, object state, short token) - { - ((IUniTaskSource)this).OnCompleted(continuation, state, token); - } - - System.Threading.Tasks.Sources.ValueTaskSourceStatus System.Threading.Tasks.Sources.IValueTaskSource.GetStatus(short token) - { - return (System.Threading.Tasks.Sources.ValueTaskSourceStatus)(int)((IUniTaskSource)this).GetStatus(token); - } - - T System.Threading.Tasks.Sources.IValueTaskSource.GetResult(short token) - { - return ((IUniTaskSource)this).GetResult(token); - } - - void System.Threading.Tasks.Sources.IValueTaskSource.OnCompleted(Action continuation, object state, short token, System.Threading.Tasks.Sources.ValueTaskSourceOnCompletedFlags flags) - { - // ignore flags, always none. - ((IUniTaskSource)this).OnCompleted(continuation, state, token); - } - -#endif - } - - public static class UniTaskStatusExtensions - { - /// status != Pending. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsCompleted(this UniTaskStatus status) - { - return status != UniTaskStatus.Pending; - } - - /// status == Succeeded. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsCompletedSuccessfully(this UniTaskStatus status) - { - return status == UniTaskStatus.Succeeded; - } - - /// status == Canceled. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsCanceled(this UniTaskStatus status) - { - return status == UniTaskStatus.Canceled; - } - - /// status == Faulted. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsFaulted(this UniTaskStatus status) - { - return status == UniTaskStatus.Faulted; - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/IUniTaskSource.cs.meta b/VirtueSky/UniTask/Runtime/IUniTaskSource.cs.meta deleted file mode 100644 index b225d1c7..00000000 --- a/VirtueSky/UniTask/Runtime/IUniTaskSource.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3e4d023d8404ab742b5e808c98097c3c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Internal.meta b/VirtueSky/UniTask/Runtime/Internal.meta deleted file mode 100644 index f15b74e5..00000000 --- a/VirtueSky/UniTask/Runtime/Internal.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 5d5f78ec1cb1a7446a42133fdca9ec90 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Internal/ArrayPool.cs b/VirtueSky/UniTask/Runtime/Internal/ArrayPool.cs deleted file mode 100644 index d322ac84..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/ArrayPool.cs +++ /dev/null @@ -1,150 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Internal -{ - // Same interface as System.Buffers.ArrayPool but only provides Shared. - - internal sealed class ArrayPool - { - // Same size as System.Buffers.DefaultArrayPool - const int DefaultMaxNumberOfArraysPerBucket = 50; - - static readonly T[] EmptyArray = new T[0]; - - public static readonly ArrayPool Shared = new ArrayPool(); - - readonly MinimumQueue[] buckets; - readonly SpinLock[] locks; - - ArrayPool() - { - // see: GetQueueIndex - buckets = new MinimumQueue[18]; - locks = new SpinLock[18]; - for (int i = 0; i < buckets.Length; i++) - { - buckets[i] = new MinimumQueue(4); - locks[i] = new SpinLock(false); - } - } - - public T[] Rent(int minimumLength) - { - if (minimumLength < 0) - { - throw new ArgumentOutOfRangeException("minimumLength"); - } - else if (minimumLength == 0) - { - return EmptyArray; - } - - var size = CalculateSize(minimumLength); - var index = GetQueueIndex(size); - if (index != -1) - { - var q = buckets[index]; - var lockTaken = false; - try - { - locks[index].Enter(ref lockTaken); - - if (q.Count != 0) - { - return q.Dequeue(); - } - } - finally - { - if (lockTaken) locks[index].Exit(false); - } - } - - return new T[size]; - } - - public void Return(T[] array, bool clearArray = false) - { - if (array == null || array.Length == 0) - { - return; - } - - var index = GetQueueIndex(array.Length); - if (index != -1) - { - if (clearArray) - { - Array.Clear(array, 0, array.Length); - } - - var q = buckets[index]; - var lockTaken = false; - - try - { - locks[index].Enter(ref lockTaken); - - if (q.Count > DefaultMaxNumberOfArraysPerBucket) - { - return; - } - - q.Enqueue(array); - } - finally - { - if (lockTaken) locks[index].Exit(false); - } - } - } - - static int CalculateSize(int size) - { - size--; - size |= size >> 1; - size |= size >> 2; - size |= size >> 4; - size |= size >> 8; - size |= size >> 16; - size += 1; - - if (size < 8) - { - size = 8; - } - - return size; - } - - static int GetQueueIndex(int size) - { - switch (size) - { - case 8: return 0; - case 16: return 1; - case 32: return 2; - case 64: return 3; - case 128: return 4; - case 256: return 5; - case 512: return 6; - case 1024: return 7; - case 2048: return 8; - case 4096: return 9; - case 8192: return 10; - case 16384: return 11; - case 32768: return 12; - case 65536: return 13; - case 131072: return 14; - case 262144: return 15; - case 524288: return 16; - case 1048576: return 17; // max array length - default: - return -1; - } - } - } -} diff --git a/VirtueSky/UniTask/Runtime/Internal/ArrayPool.cs.meta b/VirtueSky/UniTask/Runtime/Internal/ArrayPool.cs.meta deleted file mode 100644 index 693816cc..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/ArrayPool.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: f83ebad81fb89fb4882331616ca6d248 -timeCreated: 1532361008 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Internal/ArrayPoolUtil.cs b/VirtueSky/UniTask/Runtime/Internal/ArrayPoolUtil.cs deleted file mode 100644 index 681da32c..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/ArrayPoolUtil.cs +++ /dev/null @@ -1,115 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Collections.Generic; -using System.Runtime.CompilerServices; - -namespace VirtueSky.Threading.Tasks.Internal -{ - internal static class ArrayPoolUtil - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static void EnsureCapacity(ref T[] array, int index, ArrayPool pool) - { - if (array.Length <= index) - { - EnsureCapacityCore(ref array, index, pool); - } - } - - [MethodImpl(MethodImplOptions.NoInlining)] - static void EnsureCapacityCore(ref T[] array, int index, ArrayPool pool) - { - if (array.Length <= index) - { - var newSize = array.Length * 2; - var newArray = pool.Rent((index < newSize) ? newSize : (index * 2)); - Array.Copy(array, 0, newArray, 0, array.Length); - - pool.Return(array, clearArray: !RuntimeHelpersAbstraction.IsWellKnownNoReferenceContainsType()); - - array = newArray; - } - } - - public static RentArray Materialize(IEnumerable source) - { - if (source is T[] array) - { - return new RentArray(array, array.Length, null); - } - - var defaultCount = 32; - if (source is ICollection coll) - { - if (coll.Count == 0) - { - return new RentArray(Array.Empty(), 0, null); - } - - defaultCount = coll.Count; - var pool = ArrayPool.Shared; - var buffer = pool.Rent(defaultCount); - coll.CopyTo(buffer, 0); - return new RentArray(buffer, coll.Count, pool); - } - else if (source is IReadOnlyCollection rcoll) - { - defaultCount = rcoll.Count; - } - - if (defaultCount == 0) - { - return new RentArray(Array.Empty(), 0, null); - } - - { - var pool = ArrayPool.Shared; - - var index = 0; - var buffer = pool.Rent(defaultCount); - foreach (var item in source) - { - EnsureCapacity(ref buffer, index, pool); - buffer[index++] = item; - } - - return new RentArray(buffer, index, pool); - } - } - - public struct RentArray : IDisposable - { - public readonly T[] Array; - public readonly int Length; - ArrayPool pool; - - public RentArray(T[] array, int length, ArrayPool pool) - { - this.Array = array; - this.Length = length; - this.pool = pool; - } - - public void Dispose() - { - DisposeManually(!RuntimeHelpersAbstraction.IsWellKnownNoReferenceContainsType()); - } - - public void DisposeManually(bool clearArray) - { - if (pool != null) - { - if (clearArray) - { - System.Array.Clear(Array, 0, Length); - } - - pool.Return(Array, clearArray: false); - pool = null; - } - } - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/Internal/ArrayPoolUtil.cs.meta b/VirtueSky/UniTask/Runtime/Internal/ArrayPoolUtil.cs.meta deleted file mode 100644 index e06ec652..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/ArrayPoolUtil.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 424cc208fb61d4e448b08fcfa0eee25e -timeCreated: 1532361007 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Internal/ArrayUtil.cs b/VirtueSky/UniTask/Runtime/Internal/ArrayUtil.cs deleted file mode 100644 index 894a3c46..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/ArrayUtil.cs +++ /dev/null @@ -1,73 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Collections.Generic; -using System.Runtime.CompilerServices; - -namespace VirtueSky.Threading.Tasks.Internal -{ - internal static class ArrayUtil - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void EnsureCapacity(ref T[] array, int index) - { - if (array.Length <= index) - { - EnsureCore(ref array, index); - } - } - - // rare case, no inlining. - [MethodImpl(MethodImplOptions.NoInlining)] - static void EnsureCore(ref T[] array, int index) - { - var newSize = array.Length * 2; - var newArray = new T[(index < newSize) ? newSize : (index * 2)]; - Array.Copy(array, 0, newArray, 0, array.Length); - - array = newArray; - } - - /// - /// Optimizing utility to avoid .ToArray() that creates buffer copy(cut to just size). - /// - public static (T[] array, int length) Materialize(IEnumerable source) - { - if (source is T[] array) - { - return (array, array.Length); - } - - var defaultCount = 4; - if (source is ICollection coll) - { - defaultCount = coll.Count; - var buffer = new T[defaultCount]; - coll.CopyTo(buffer, 0); - return (buffer, defaultCount); - } - else if (source is IReadOnlyCollection rcoll) - { - defaultCount = rcoll.Count; - } - - if (defaultCount == 0) - { - return (Array.Empty(), 0); - } - - { - var index = 0; - var buffer = new T[defaultCount]; - foreach (var item in source) - { - EnsureCapacity(ref buffer, index); - buffer[index++] = item; - } - - return (buffer, index); - } - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/Internal/ArrayUtil.cs.meta b/VirtueSky/UniTask/Runtime/Internal/ArrayUtil.cs.meta deleted file mode 100644 index 645fc4ed..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/ArrayUtil.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 23146a82ec99f2542a87971c8d3d7988 -timeCreated: 1532361007 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Internal/ContinuationQueue.cs b/VirtueSky/UniTask/Runtime/Internal/ContinuationQueue.cs deleted file mode 100644 index b6d2be47..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/ContinuationQueue.cs +++ /dev/null @@ -1,225 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Internal -{ - internal sealed class ContinuationQueue - { - const int MaxArrayLength = 0X7FEFFFFF; - const int InitialSize = 16; - - readonly PlayerLoopTiming timing; - - SpinLock gate = new SpinLock(false); - bool dequing = false; - - int actionListCount = 0; - Action[] actionList = new Action[InitialSize]; - - int waitingListCount = 0; - Action[] waitingList = new Action[InitialSize]; - - public ContinuationQueue(PlayerLoopTiming timing) - { - this.timing = timing; - } - - public void Enqueue(Action continuation) - { - bool lockTaken = false; - try - { - gate.Enter(ref lockTaken); - - if (dequing) - { - // Ensure Capacity - if (waitingList.Length == waitingListCount) - { - var newLength = waitingListCount * 2; - if ((uint)newLength > MaxArrayLength) newLength = MaxArrayLength; - - var newArray = new Action[newLength]; - Array.Copy(waitingList, newArray, waitingListCount); - waitingList = newArray; - } - waitingList[waitingListCount] = continuation; - waitingListCount++; - } - else - { - // Ensure Capacity - if (actionList.Length == actionListCount) - { - var newLength = actionListCount * 2; - if ((uint)newLength > MaxArrayLength) newLength = MaxArrayLength; - - var newArray = new Action[newLength]; - Array.Copy(actionList, newArray, actionListCount); - actionList = newArray; - } - actionList[actionListCount] = continuation; - actionListCount++; - } - } - finally - { - if (lockTaken) gate.Exit(false); - } - } - - public int Clear() - { - var rest = actionListCount + waitingListCount; - - actionListCount = 0; - actionList = new Action[InitialSize]; - - waitingListCount = 0; - waitingList = new Action[InitialSize]; - - return rest; - } - - // delegate entrypoint. - public void Run() - { - // for debugging, create named stacktrace. -#if DEBUG - switch (timing) - { - case PlayerLoopTiming.Initialization: - Initialization(); - break; - case PlayerLoopTiming.LastInitialization: - LastInitialization(); - break; - case PlayerLoopTiming.EarlyUpdate: - EarlyUpdate(); - break; - case PlayerLoopTiming.LastEarlyUpdate: - LastEarlyUpdate(); - break; - case PlayerLoopTiming.FixedUpdate: - FixedUpdate(); - break; - case PlayerLoopTiming.LastFixedUpdate: - LastFixedUpdate(); - break; - case PlayerLoopTiming.PreUpdate: - PreUpdate(); - break; - case PlayerLoopTiming.LastPreUpdate: - LastPreUpdate(); - break; - case PlayerLoopTiming.Update: - Update(); - break; - case PlayerLoopTiming.LastUpdate: - LastUpdate(); - break; - case PlayerLoopTiming.PreLateUpdate: - PreLateUpdate(); - break; - case PlayerLoopTiming.LastPreLateUpdate: - LastPreLateUpdate(); - break; - case PlayerLoopTiming.PostLateUpdate: - PostLateUpdate(); - break; - case PlayerLoopTiming.LastPostLateUpdate: - LastPostLateUpdate(); - break; -#if UNITY_2020_2_OR_NEWER - case PlayerLoopTiming.TimeUpdate: - TimeUpdate(); - break; - case PlayerLoopTiming.LastTimeUpdate: - LastTimeUpdate(); - break; -#endif - default: - break; - } -#else - RunCore(); -#endif - } - - void Initialization() => RunCore(); - void LastInitialization() => RunCore(); - void EarlyUpdate() => RunCore(); - void LastEarlyUpdate() => RunCore(); - void FixedUpdate() => RunCore(); - void LastFixedUpdate() => RunCore(); - void PreUpdate() => RunCore(); - void LastPreUpdate() => RunCore(); - void Update() => RunCore(); - void LastUpdate() => RunCore(); - void PreLateUpdate() => RunCore(); - void LastPreLateUpdate() => RunCore(); - void PostLateUpdate() => RunCore(); - void LastPostLateUpdate() => RunCore(); -#if UNITY_2020_2_OR_NEWER - void TimeUpdate() => RunCore(); - void LastTimeUpdate() => RunCore(); -#endif - - [System.Diagnostics.DebuggerHidden] - void RunCore() - { - { - bool lockTaken = false; - try - { - gate.Enter(ref lockTaken); - if (actionListCount == 0) return; - dequing = true; - } - finally - { - if (lockTaken) gate.Exit(false); - } - } - - for (int i = 0; i < actionListCount; i++) - { - - var action = actionList[i]; - actionList[i] = null; - try - { - action(); - } - catch (Exception ex) - { - UnityEngine.Debug.LogException(ex); - } - } - - { - bool lockTaken = false; - try - { - gate.Enter(ref lockTaken); - dequing = false; - - var swapTempActionList = actionList; - - actionListCount = waitingListCount; - actionList = waitingList; - - waitingListCount = 0; - waitingList = swapTempActionList; - } - finally - { - if (lockTaken) gate.Exit(false); - } - } - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/Internal/ContinuationQueue.cs.meta b/VirtueSky/UniTask/Runtime/Internal/ContinuationQueue.cs.meta deleted file mode 100644 index b04e5418..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/ContinuationQueue.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f66c32454e50f2546b17deadc80a4c77 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Internal/DiagnosticsExtensions.cs b/VirtueSky/UniTask/Runtime/Internal/DiagnosticsExtensions.cs deleted file mode 100644 index 3bfa0103..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/DiagnosticsExtensions.cs +++ /dev/null @@ -1,249 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Security; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using UnityEngine; - -namespace VirtueSky.Threading.Tasks.Internal -{ - internal static class DiagnosticsExtensions - { - static bool displayFilenames = true; - - static readonly Regex typeBeautifyRegex = new Regex("`.+$", RegexOptions.Compiled); - - static readonly Dictionary builtInTypeNames = new Dictionary - { - { typeof(void), "void" }, - { typeof(bool), "bool" }, - { typeof(byte), "byte" }, - { typeof(char), "char" }, - { typeof(decimal), "decimal" }, - { typeof(double), "double" }, - { typeof(float), "float" }, - { typeof(int), "int" }, - { typeof(long), "long" }, - { typeof(object), "object" }, - { typeof(sbyte), "sbyte" }, - { typeof(short), "short" }, - { typeof(string), "string" }, - { typeof(uint), "uint" }, - { typeof(ulong), "ulong" }, - { typeof(ushort), "ushort" }, - { typeof(Task), "Task" }, - { typeof(UniTask), "UniTask" }, - { typeof(UniTaskVoid), "UniTaskVoid" } - }; - - public static string CleanupAsyncStackTrace(this StackTrace stackTrace) - { - if (stackTrace == null) return ""; - - var sb = new StringBuilder(); - for (int i = 0; i < stackTrace.FrameCount; i++) - { - var sf = stackTrace.GetFrame(i); - - var mb = sf.GetMethod(); - - if (IgnoreLine(mb)) continue; - if (IsAsync(mb)) - { - sb.Append("async "); - TryResolveStateMachineMethod(ref mb, out var decType); - } - - // return type - if (mb is MethodInfo mi) - { - sb.Append(BeautifyType(mi.ReturnType, false)); - sb.Append(" "); - } - - // method name - sb.Append(BeautifyType(mb.DeclaringType, false)); - if (!mb.IsConstructor) - { - sb.Append("."); - } - sb.Append(mb.Name); - if (mb.IsGenericMethod) - { - sb.Append("<"); - foreach (var item in mb.GetGenericArguments()) - { - sb.Append(BeautifyType(item, true)); - } - sb.Append(">"); - } - - // parameter - sb.Append("("); - sb.Append(string.Join(", ", mb.GetParameters().Select(p => BeautifyType(p.ParameterType, true) + " " + p.Name))); - sb.Append(")"); - - // file name - if (displayFilenames && (sf.GetILOffset() != -1)) - { - String fileName = null; - - try - { - fileName = sf.GetFileName(); - } - catch (NotSupportedException) - { - displayFilenames = false; - } - catch (SecurityException) - { - displayFilenames = false; - } - - if (fileName != null) - { - sb.Append(' '); - sb.AppendFormat(CultureInfo.InvariantCulture, "(at {0})", AppendHyperLink(fileName, sf.GetFileLineNumber().ToString())); - } - } - - sb.AppendLine(); - } - return sb.ToString(); - } - - - static bool IsAsync(MethodBase methodInfo) - { - var declareType = methodInfo.DeclaringType; - return typeof(IAsyncStateMachine).IsAssignableFrom(declareType); - } - - // code from Ben.Demystifier/EnhancedStackTrace.Frame.cs - static bool TryResolveStateMachineMethod(ref MethodBase method, out Type declaringType) - { - declaringType = method.DeclaringType; - - var parentType = declaringType.DeclaringType; - if (parentType == null) - { - return false; - } - - var methods = parentType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly); - if (methods == null) - { - return false; - } - - foreach (var candidateMethod in methods) - { - var attributes = candidateMethod.GetCustomAttributes(false); - if (attributes == null) - { - continue; - } - - foreach (var asma in attributes) - { - if (asma.StateMachineType == declaringType) - { - method = candidateMethod; - declaringType = candidateMethod.DeclaringType; - // Mark the iterator as changed; so it gets the + annotation of the original method - // async statemachines resolve directly to their builder methods so aren't marked as changed - return asma is IteratorStateMachineAttribute; - } - } - } - - return false; - } - - static string BeautifyType(Type t, bool shortName) - { - if (builtInTypeNames.TryGetValue(t, out var builtin)) - { - return builtin; - } - if (t.IsGenericParameter) return t.Name; - if (t.IsArray) return BeautifyType(t.GetElementType(), shortName) + "[]"; - if (t.FullName?.StartsWith("System.ValueTuple") ?? false) - { - return "(" + string.Join(", ", t.GetGenericArguments().Select(x => BeautifyType(x, true))) + ")"; - } - if (!t.IsGenericType) return shortName ? t.Name : t.FullName.Replace("Cysharp.Threading.Tasks.Triggers.", "").Replace("Cysharp.Threading.Tasks.Internal.", "").Replace("Cysharp.Threading.Tasks.", "") ?? t.Name; - - var innerFormat = string.Join(", ", t.GetGenericArguments().Select(x => BeautifyType(x, true))); - - var genericType = t.GetGenericTypeDefinition().FullName; - if (genericType == "System.Threading.Tasks.Task`1") - { - genericType = "Task"; - } - - return typeBeautifyRegex.Replace(genericType, "").Replace("Cysharp.Threading.Tasks.Triggers.", "").Replace("Cysharp.Threading.Tasks.Internal.", "").Replace("Cysharp.Threading.Tasks.", "") + "<" + innerFormat + ">"; - } - - static bool IgnoreLine(MethodBase methodInfo) - { - var declareType = methodInfo.DeclaringType.FullName; - if (declareType == "System.Threading.ExecutionContext") - { - return true; - } - else if (declareType.StartsWith("System.Runtime.CompilerServices")) - { - return true; - } - else if (declareType.StartsWith("Cysharp.Threading.Tasks.CompilerServices")) - { - return true; - } - else if (declareType == "System.Threading.Tasks.AwaitTaskContinuation") - { - return true; - } - else if (declareType.StartsWith("System.Threading.Tasks.Task")) - { - return true; - } - else if (declareType.StartsWith("Cysharp.Threading.Tasks.UniTaskCompletionSourceCore")) - { - return true; - } - else if (declareType.StartsWith("Cysharp.Threading.Tasks.AwaiterActions")) - { - return true; - } - - return false; - } - - static string AppendHyperLink(string path, string line) - { - var fi = new FileInfo(path); - if (fi.Directory == null) - { - return fi.Name; - } - else - { - var fname = fi.FullName.Replace(Path.DirectorySeparatorChar, '/').Replace(PlayerLoopHelper.ApplicationDataPath, ""); - var withAssetsPath = "Assets/" + fname; - return "" + withAssetsPath + ":" + line + ""; - } - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/Internal/DiagnosticsExtensions.cs.meta b/VirtueSky/UniTask/Runtime/Internal/DiagnosticsExtensions.cs.meta deleted file mode 100644 index 6c1f06c2..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/DiagnosticsExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f80fb1c9ed4c99447be1b0a47a8d980b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Internal/Error.cs b/VirtueSky/UniTask/Runtime/Internal/Error.cs deleted file mode 100644 index 312333dc..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/Error.cs +++ /dev/null @@ -1,79 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Runtime.CompilerServices; - -namespace VirtueSky.Threading.Tasks.Internal -{ - internal static class Error - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void ThrowArgumentNullException(T value, string paramName) - where T : class - { - if (value == null) ThrowArgumentNullExceptionCore(paramName); - } - - [MethodImpl(MethodImplOptions.NoInlining)] - static void ThrowArgumentNullExceptionCore(string paramName) - { - throw new ArgumentNullException(paramName); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Exception ArgumentOutOfRange(string paramName) - { - return new ArgumentOutOfRangeException(paramName); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Exception NoElements() - { - return new InvalidOperationException("Source sequence doesn't contain any elements."); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Exception MoreThanOneElement() - { - return new InvalidOperationException("Source sequence contains more than one element."); - } - - [MethodImpl(MethodImplOptions.NoInlining)] - public static void ThrowArgumentException(string message) - { - throw new ArgumentException(message); - } - - [MethodImpl(MethodImplOptions.NoInlining)] - public static void ThrowNotYetCompleted() - { - throw new InvalidOperationException("Not yet completed."); - } - - [MethodImpl(MethodImplOptions.NoInlining)] - public static T ThrowNotYetCompleted() - { - throw new InvalidOperationException("Not yet completed."); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void ThrowWhenContinuationIsAlreadyRegistered(T continuationField) - where T : class - { - if (continuationField != null) ThrowInvalidOperationExceptionCore("continuation is already registered."); - } - - [MethodImpl(MethodImplOptions.NoInlining)] - static void ThrowInvalidOperationExceptionCore(string message) - { - throw new InvalidOperationException(message); - } - - [MethodImpl(MethodImplOptions.NoInlining)] - public static void ThrowOperationCanceledException() - { - throw new OperationCanceledException(); - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/Internal/Error.cs.meta b/VirtueSky/UniTask/Runtime/Internal/Error.cs.meta deleted file mode 100644 index 2e5d219a..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/Error.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 5f39f495294d4604b8082202faf98554 -timeCreated: 1532361007 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Internal/MinimumQueue.cs b/VirtueSky/UniTask/Runtime/Internal/MinimumQueue.cs deleted file mode 100644 index 1a30dd0d..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/MinimumQueue.cs +++ /dev/null @@ -1,112 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Runtime.CompilerServices; - -namespace VirtueSky.Threading.Tasks.Internal -{ - // optimized version of Standard Queue. - internal class MinimumQueue - { - const int MinimumGrow = 4; - const int GrowFactor = 200; - - T[] array; - int head; - int tail; - int size; - - public MinimumQueue(int capacity) - { - if (capacity < 0) throw new ArgumentOutOfRangeException("capacity"); - array = new T[capacity]; - head = tail = size = 0; - } - - public int Count - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get { return size; } - } - - public T Peek() - { - if (size == 0) ThrowForEmptyQueue(); - return array[head]; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void Enqueue(T item) - { - if (size == array.Length) - { - Grow(); - } - - array[tail] = item; - MoveNext(ref tail); - size++; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public T Dequeue() - { - if (size == 0) ThrowForEmptyQueue(); - - int head = this.head; - T[] array = this.array; - T removed = array[head]; - array[head] = default(T); - MoveNext(ref this.head); - size--; - return removed; - } - - void Grow() - { - int newcapacity = (int)((long)array.Length * (long)GrowFactor / 100); - if (newcapacity < array.Length + MinimumGrow) - { - newcapacity = array.Length + MinimumGrow; - } - SetCapacity(newcapacity); - } - - void SetCapacity(int capacity) - { - T[] newarray = new T[capacity]; - if (size > 0) - { - if (head < tail) - { - Array.Copy(array, head, newarray, 0, size); - } - else - { - Array.Copy(array, head, newarray, 0, array.Length - head); - Array.Copy(array, 0, newarray, array.Length - head, tail); - } - } - - array = newarray; - head = 0; - tail = (size == capacity) ? 0 : size; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - void MoveNext(ref int index) - { - int tmp = index + 1; - if (tmp == array.Length) - { - tmp = 0; - } - index = tmp; - } - - void ThrowForEmptyQueue() - { - throw new InvalidOperationException("EmptyQueue"); - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Internal/MinimumQueue.cs.meta b/VirtueSky/UniTask/Runtime/Internal/MinimumQueue.cs.meta deleted file mode 100644 index dc067367..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/MinimumQueue.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7d63add489ccc99498114d79702b904d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Internal/PlayerLoopRunner.cs b/VirtueSky/UniTask/Runtime/Internal/PlayerLoopRunner.cs deleted file mode 100644 index 6bb882f3..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/PlayerLoopRunner.cs +++ /dev/null @@ -1,260 +0,0 @@ - -using System; -using UnityEngine; - -namespace VirtueSky.Threading.Tasks.Internal -{ - internal sealed class PlayerLoopRunner - { - const int InitialSize = 16; - - readonly PlayerLoopTiming timing; - readonly object runningAndQueueLock = new object(); - readonly object arrayLock = new object(); - readonly Action unhandledExceptionCallback; - - int tail = 0; - bool running = false; - IPlayerLoopItem[] loopItems = new IPlayerLoopItem[InitialSize]; - MinimumQueue waitQueue = new MinimumQueue(InitialSize); - - - - public PlayerLoopRunner(PlayerLoopTiming timing) - { - this.unhandledExceptionCallback = ex => Debug.LogException(ex); - this.timing = timing; - } - - public void AddAction(IPlayerLoopItem item) - { - lock (runningAndQueueLock) - { - if (running) - { - waitQueue.Enqueue(item); - return; - } - } - - lock (arrayLock) - { - // Ensure Capacity - if (loopItems.Length == tail) - { - Array.Resize(ref loopItems, checked(tail * 2)); - } - loopItems[tail++] = item; - } - } - - public int Clear() - { - lock (arrayLock) - { - var rest = 0; - - for (var index = 0; index < loopItems.Length; index++) - { - if (loopItems[index] != null) - { - rest++; - } - - loopItems[index] = null; - } - - tail = 0; - return rest; - } - } - - // delegate entrypoint. - public void Run() - { - // for debugging, create named stacktrace. -#if DEBUG - switch (timing) - { - case PlayerLoopTiming.Initialization: - Initialization(); - break; - case PlayerLoopTiming.LastInitialization: - LastInitialization(); - break; - case PlayerLoopTiming.EarlyUpdate: - EarlyUpdate(); - break; - case PlayerLoopTiming.LastEarlyUpdate: - LastEarlyUpdate(); - break; - case PlayerLoopTiming.FixedUpdate: - FixedUpdate(); - break; - case PlayerLoopTiming.LastFixedUpdate: - LastFixedUpdate(); - break; - case PlayerLoopTiming.PreUpdate: - PreUpdate(); - break; - case PlayerLoopTiming.LastPreUpdate: - LastPreUpdate(); - break; - case PlayerLoopTiming.Update: - Update(); - break; - case PlayerLoopTiming.LastUpdate: - LastUpdate(); - break; - case PlayerLoopTiming.PreLateUpdate: - PreLateUpdate(); - break; - case PlayerLoopTiming.LastPreLateUpdate: - LastPreLateUpdate(); - break; - case PlayerLoopTiming.PostLateUpdate: - PostLateUpdate(); - break; - case PlayerLoopTiming.LastPostLateUpdate: - LastPostLateUpdate(); - break; -#if UNITY_2020_2_OR_NEWER - case PlayerLoopTiming.TimeUpdate: - TimeUpdate(); - break; - case PlayerLoopTiming.LastTimeUpdate: - LastTimeUpdate(); - break; -#endif - default: - break; - } -#else - RunCore(); -#endif - } - - void Initialization() => RunCore(); - void LastInitialization() => RunCore(); - void EarlyUpdate() => RunCore(); - void LastEarlyUpdate() => RunCore(); - void FixedUpdate() => RunCore(); - void LastFixedUpdate() => RunCore(); - void PreUpdate() => RunCore(); - void LastPreUpdate() => RunCore(); - void Update() => RunCore(); - void LastUpdate() => RunCore(); - void PreLateUpdate() => RunCore(); - void LastPreLateUpdate() => RunCore(); - void PostLateUpdate() => RunCore(); - void LastPostLateUpdate() => RunCore(); -#if UNITY_2020_2_OR_NEWER - void TimeUpdate() => RunCore(); - void LastTimeUpdate() => RunCore(); -#endif - - [System.Diagnostics.DebuggerHidden] - void RunCore() - { - lock (runningAndQueueLock) - { - running = true; - } - - lock (arrayLock) - { - var j = tail - 1; - - for (int i = 0; i < loopItems.Length; i++) - { - var action = loopItems[i]; - if (action != null) - { - try - { - if (!action.MoveNext()) - { - loopItems[i] = null; - } - else - { - continue; // next i - } - } - catch (Exception ex) - { - loopItems[i] = null; - try - { - unhandledExceptionCallback(ex); - } - catch { } - } - } - - // find null, loop from tail - while (i < j) - { - var fromTail = loopItems[j]; - if (fromTail != null) - { - try - { - if (!fromTail.MoveNext()) - { - loopItems[j] = null; - j--; - continue; // next j - } - else - { - // swap - loopItems[i] = fromTail; - loopItems[j] = null; - j--; - goto NEXT_LOOP; // next i - } - } - catch (Exception ex) - { - loopItems[j] = null; - j--; - try - { - unhandledExceptionCallback(ex); - } - catch { } - continue; // next j - } - } - else - { - j--; - } - } - - tail = i; // loop end - break; // LOOP END - - NEXT_LOOP: - continue; - } - - - lock (runningAndQueueLock) - { - running = false; - while (waitQueue.Count != 0) - { - if (loopItems.Length == tail) - { - Array.Resize(ref loopItems, checked(tail * 2)); - } - loopItems[tail++] = waitQueue.Dequeue(); - } - } - } - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/Internal/PlayerLoopRunner.cs.meta b/VirtueSky/UniTask/Runtime/Internal/PlayerLoopRunner.cs.meta deleted file mode 100644 index 603dbc93..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/PlayerLoopRunner.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 340c6d420bb4f484aa8683415ea92571 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Internal/PooledDelegate.cs b/VirtueSky/UniTask/Runtime/Internal/PooledDelegate.cs deleted file mode 100644 index 3b57da03..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/PooledDelegate.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Runtime.CompilerServices; - -namespace VirtueSky.Threading.Tasks.Internal -{ - internal sealed class PooledDelegate : ITaskPoolNode> - { - static TaskPool> pool; - - PooledDelegate nextNode; - public ref PooledDelegate NextNode => ref nextNode; - - static PooledDelegate() - { - TaskPool.RegisterSizeGetter(typeof(PooledDelegate), () => pool.Size); - } - - readonly Action runDelegate; - Action continuation; - - PooledDelegate() - { - runDelegate = Run; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Action Create(Action continuation) - { - if (!pool.TryPop(out var item)) - { - item = new PooledDelegate(); - } - - item.continuation = continuation; - return item.runDelegate; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - void Run(T _) - { - var call = continuation; - continuation = null; - if (call != null) - { - pool.TryPush(this); - call.Invoke(); - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Internal/PooledDelegate.cs.meta b/VirtueSky/UniTask/Runtime/Internal/PooledDelegate.cs.meta deleted file mode 100644 index 7f92aff4..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/PooledDelegate.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8932579438742fa40b010edd412dbfba -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Internal/RuntimeHelpersAbstraction.cs b/VirtueSky/UniTask/Runtime/Internal/RuntimeHelpersAbstraction.cs deleted file mode 100644 index 73509041..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/RuntimeHelpersAbstraction.cs +++ /dev/null @@ -1,64 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -#if UNITY_2018_3_OR_NEWER -using UnityEngine; -#endif - -namespace VirtueSky.Threading.Tasks.Internal -{ - internal static class RuntimeHelpersAbstraction - { - // If we can use RuntimeHelpers.IsReferenceOrContainsReferences(.NET Core 2.0), use it. - public static bool IsWellKnownNoReferenceContainsType() - { - return WellKnownNoReferenceContainsType.IsWellKnownType; - } - - static bool WellKnownNoReferenceContainsTypeInitialize(Type t) - { - // The primitive types are Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double, and Single. - if (t.IsPrimitive) return true; - - if (t.IsEnum) return true; - if (t == typeof(DateTime)) return true; - if (t == typeof(DateTimeOffset)) return true; - if (t == typeof(Guid)) return true; - if (t == typeof(decimal)) return true; - - // unwrap nullable - if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) - { - return WellKnownNoReferenceContainsTypeInitialize(t.GetGenericArguments()[0]); - } - -#if UNITY_2018_3_OR_NEWER - - // or add other wellknown types(Vector, etc...) here - if (t == typeof(Vector2)) return true; - if (t == typeof(Vector3)) return true; - if (t == typeof(Vector4)) return true; - if (t == typeof(Color)) return true; - if (t == typeof(Rect)) return true; - if (t == typeof(Bounds)) return true; - if (t == typeof(Quaternion)) return true; - if (t == typeof(Vector2Int)) return true; - if (t == typeof(Vector3Int)) return true; - -#endif - - return false; - } - - static class WellKnownNoReferenceContainsType - { - public static readonly bool IsWellKnownType; - - static WellKnownNoReferenceContainsType() - { - IsWellKnownType = WellKnownNoReferenceContainsTypeInitialize(typeof(T)); - } - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/Internal/RuntimeHelpersAbstraction.cs.meta b/VirtueSky/UniTask/Runtime/Internal/RuntimeHelpersAbstraction.cs.meta deleted file mode 100644 index 42543911..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/RuntimeHelpersAbstraction.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 94975e4d4e0c0ea4ba787d3872ce9bb4 -timeCreated: 1532361007 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Internal/StatePool.cs b/VirtueSky/UniTask/Runtime/Internal/StatePool.cs deleted file mode 100644 index 48634dd7..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/StatePool.cs +++ /dev/null @@ -1,153 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Runtime.CompilerServices; - -namespace VirtueSky.Threading.Tasks.Internal -{ - internal static class StateTuple - { - public static StateTuple Create(T1 item1) - { - return StatePool.Create(item1); - } - - public static StateTuple Create(T1 item1, T2 item2) - { - return StatePool.Create(item1, item2); - } - - public static StateTuple Create(T1 item1, T2 item2, T3 item3) - { - return StatePool.Create(item1, item2, item3); - } - } - - internal class StateTuple : IDisposable - { - public T1 Item1; - - public void Deconstruct(out T1 item1) - { - item1 = this.Item1; - } - - public void Dispose() - { - StatePool.Return(this); - } - } - - internal static class StatePool - { - static readonly ConcurrentQueue> queue = new ConcurrentQueue>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static StateTuple Create(T1 item1) - { - if (queue.TryDequeue(out var value)) - { - value.Item1 = item1; - return value; - } - - return new StateTuple { Item1 = item1 }; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void Return(StateTuple tuple) - { - tuple.Item1 = default; - queue.Enqueue(tuple); - } - } - - internal class StateTuple : IDisposable - { - public T1 Item1; - public T2 Item2; - - public void Deconstruct(out T1 item1, out T2 item2) - { - item1 = this.Item1; - item2 = this.Item2; - } - - public void Dispose() - { - StatePool.Return(this); - } - } - - internal static class StatePool - { - static readonly ConcurrentQueue> queue = new ConcurrentQueue>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static StateTuple Create(T1 item1, T2 item2) - { - if (queue.TryDequeue(out var value)) - { - value.Item1 = item1; - value.Item2 = item2; - return value; - } - - return new StateTuple { Item1 = item1, Item2 = item2 }; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void Return(StateTuple tuple) - { - tuple.Item1 = default; - tuple.Item2 = default; - queue.Enqueue(tuple); - } - } - - internal class StateTuple : IDisposable - { - public T1 Item1; - public T2 Item2; - public T3 Item3; - - public void Deconstruct(out T1 item1, out T2 item2, out T3 item3) - { - item1 = this.Item1; - item2 = this.Item2; - item3 = this.Item3; - } - - public void Dispose() - { - StatePool.Return(this); - } - } - - internal static class StatePool - { - static readonly ConcurrentQueue> queue = new ConcurrentQueue>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static StateTuple Create(T1 item1, T2 item2, T3 item3) - { - if (queue.TryDequeue(out var value)) - { - value.Item1 = item1; - value.Item2 = item2; - value.Item3 = item3; - return value; - } - - return new StateTuple { Item1 = item1, Item2 = item2, Item3 = item3 }; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void Return(StateTuple tuple) - { - tuple.Item1 = default; - tuple.Item2 = default; - tuple.Item3 = default; - queue.Enqueue(tuple); - } - } -} diff --git a/VirtueSky/UniTask/Runtime/Internal/StatePool.cs.meta b/VirtueSky/UniTask/Runtime/Internal/StatePool.cs.meta deleted file mode 100644 index 6779aa1e..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/StatePool.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 60cdf0bcaea36b444a7ae7263ae7598f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Internal/TaskTracker.cs b/VirtueSky/UniTask/Runtime/Internal/TaskTracker.cs deleted file mode 100644 index 3cae78c7..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/TaskTracker.cs +++ /dev/null @@ -1,178 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Text; -using System.Threading; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks -{ - // public for add user custom. - - public static class TaskTracker - { -#if UNITY_EDITOR - - static int trackingId = 0; - - public const string EnableAutoReloadKey = "UniTaskTrackerWindow_EnableAutoReloadKey"; - public const string EnableTrackingKey = "UniTaskTrackerWindow_EnableTrackingKey"; - public const string EnableStackTraceKey = "UniTaskTrackerWindow_EnableStackTraceKey"; - - public static class EditorEnableState - { - static bool enableAutoReload; - public static bool EnableAutoReload - { - get { return enableAutoReload; } - set - { - enableAutoReload = value; - UnityEditor.EditorPrefs.SetBool(EnableAutoReloadKey, value); - } - } - - static bool enableTracking; - public static bool EnableTracking - { - get { return enableTracking; } - set - { - enableTracking = value; - UnityEditor.EditorPrefs.SetBool(EnableTrackingKey, value); - } - } - - static bool enableStackTrace; - public static bool EnableStackTrace - { - get { return enableStackTrace; } - set - { - enableStackTrace = value; - UnityEditor.EditorPrefs.SetBool(EnableStackTraceKey, value); - } - } - } - -#endif - - - static List> listPool = new List>(); - - static readonly WeakDictionary tracking = new WeakDictionary(); - - [Conditional("UNITY_EDITOR")] - public static void TrackActiveTask(IUniTaskSource task, int skipFrame) - { -#if UNITY_EDITOR - dirty = true; - if (!EditorEnableState.EnableTracking) return; - var stackTrace = EditorEnableState.EnableStackTrace ? new StackTrace(skipFrame, true).CleanupAsyncStackTrace() : ""; - - string typeName; - if (EditorEnableState.EnableStackTrace) - { - var sb = new StringBuilder(); - TypeBeautify(task.GetType(), sb); - typeName = sb.ToString(); - } - else - { - typeName = task.GetType().Name; - } - tracking.TryAdd(task, (typeName, Interlocked.Increment(ref trackingId), DateTime.UtcNow, stackTrace)); -#endif - } - - [Conditional("UNITY_EDITOR")] - public static void RemoveTracking(IUniTaskSource task) - { -#if UNITY_EDITOR - dirty = true; - if (!EditorEnableState.EnableTracking) return; - var success = tracking.TryRemove(task); -#endif - } - - static bool dirty; - - public static bool CheckAndResetDirty() - { - var current = dirty; - dirty = false; - return current; - } - - /// (trackingId, awaiterType, awaiterStatus, createdTime, stackTrace) - public static void ForEachActiveTask(Action action) - { - lock (listPool) - { - var count = tracking.ToList(ref listPool, clear: false); - try - { - for (int i = 0; i < count; i++) - { - action(listPool[i].Value.trackingId, listPool[i].Value.formattedType, listPool[i].Key.UnsafeGetStatus(), listPool[i].Value.addTime, listPool[i].Value.stackTrace); - listPool[i] = default; - } - } - catch - { - listPool.Clear(); - throw; - } - } - } - - static void TypeBeautify(Type type, StringBuilder sb) - { - if (type.IsNested) - { - // TypeBeautify(type.DeclaringType, sb); - sb.Append(type.DeclaringType.Name.ToString()); - sb.Append("."); - } - - if (type.IsGenericType) - { - var genericsStart = type.Name.IndexOf("`"); - if (genericsStart != -1) - { - sb.Append(type.Name.Substring(0, genericsStart)); - } - else - { - sb.Append(type.Name); - } - sb.Append("<"); - var first = true; - foreach (var item in type.GetGenericArguments()) - { - if (!first) - { - sb.Append(", "); - } - first = false; - TypeBeautify(item, sb); - } - sb.Append(">"); - } - else - { - sb.Append(type.Name); - } - } - - //static string RemoveUniTaskNamespace(string str) - //{ - // return str.Replace("Cysharp.Threading.Tasks.CompilerServices", "") - // .Replace("Cysharp.Threading.Tasks.Linq", "") - // .Replace("Cysharp.Threading.Tasks", ""); - //} - } -} - diff --git a/VirtueSky/UniTask/Runtime/Internal/TaskTracker.cs.meta b/VirtueSky/UniTask/Runtime/Internal/TaskTracker.cs.meta deleted file mode 100644 index 5563bf78..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/TaskTracker.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a203c73eb4ccdbb44bddfd82d38fdda9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Internal/UnityEqualityComparer.cs b/VirtueSky/UniTask/Runtime/Internal/UnityEqualityComparer.cs deleted file mode 100644 index 392a3d81..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/UnityEqualityComparer.cs +++ /dev/null @@ -1,267 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; - -namespace VirtueSky.Threading.Tasks.Internal -{ - internal static class UnityEqualityComparer - { - public static readonly IEqualityComparer Vector2 = new Vector2EqualityComparer(); - public static readonly IEqualityComparer Vector3 = new Vector3EqualityComparer(); - public static readonly IEqualityComparer Vector4 = new Vector4EqualityComparer(); - public static readonly IEqualityComparer Color = new ColorEqualityComparer(); - public static readonly IEqualityComparer Color32 = new Color32EqualityComparer(); - public static readonly IEqualityComparer Rect = new RectEqualityComparer(); - public static readonly IEqualityComparer Bounds = new BoundsEqualityComparer(); - public static readonly IEqualityComparer Quaternion = new QuaternionEqualityComparer(); - - static readonly RuntimeTypeHandle vector2Type = typeof(Vector2).TypeHandle; - static readonly RuntimeTypeHandle vector3Type = typeof(Vector3).TypeHandle; - static readonly RuntimeTypeHandle vector4Type = typeof(Vector4).TypeHandle; - static readonly RuntimeTypeHandle colorType = typeof(Color).TypeHandle; - static readonly RuntimeTypeHandle color32Type = typeof(Color32).TypeHandle; - static readonly RuntimeTypeHandle rectType = typeof(Rect).TypeHandle; - static readonly RuntimeTypeHandle boundsType = typeof(Bounds).TypeHandle; - static readonly RuntimeTypeHandle quaternionType = typeof(Quaternion).TypeHandle; - -#if UNITY_2017_2_OR_NEWER - - public static readonly IEqualityComparer Vector2Int = new Vector2IntEqualityComparer(); - public static readonly IEqualityComparer Vector3Int = new Vector3IntEqualityComparer(); - public static readonly IEqualityComparer RangeInt = new RangeIntEqualityComparer(); - public static readonly IEqualityComparer RectInt = new RectIntEqualityComparer(); - public static readonly IEqualityComparer BoundsInt = new BoundsIntEqualityComparer(); - - static readonly RuntimeTypeHandle vector2IntType = typeof(Vector2Int).TypeHandle; - static readonly RuntimeTypeHandle vector3IntType = typeof(Vector3Int).TypeHandle; - static readonly RuntimeTypeHandle rangeIntType = typeof(RangeInt).TypeHandle; - static readonly RuntimeTypeHandle rectIntType = typeof(RectInt).TypeHandle; - static readonly RuntimeTypeHandle boundsIntType = typeof(BoundsInt).TypeHandle; - -#endif - - static class Cache - { - public static readonly IEqualityComparer Comparer; - - static Cache() - { - var comparer = GetDefaultHelper(typeof(T)); - if (comparer == null) - { - Comparer = EqualityComparer.Default; - } - else - { - Comparer = (IEqualityComparer)comparer; - } - } - } - - public static IEqualityComparer GetDefault() - { - return Cache.Comparer; - } - - static object GetDefaultHelper(Type type) - { - var t = type.TypeHandle; - - if (t.Equals(vector2Type)) return (object)UnityEqualityComparer.Vector2; - if (t.Equals(vector3Type)) return (object)UnityEqualityComparer.Vector3; - if (t.Equals(vector4Type)) return (object)UnityEqualityComparer.Vector4; - if (t.Equals(colorType)) return (object)UnityEqualityComparer.Color; - if (t.Equals(color32Type)) return (object)UnityEqualityComparer.Color32; - if (t.Equals(rectType)) return (object)UnityEqualityComparer.Rect; - if (t.Equals(boundsType)) return (object)UnityEqualityComparer.Bounds; - if (t.Equals(quaternionType)) return (object)UnityEqualityComparer.Quaternion; - -#if UNITY_2017_2_OR_NEWER - - if (t.Equals(vector2IntType)) return (object)UnityEqualityComparer.Vector2Int; - if (t.Equals(vector3IntType)) return (object)UnityEqualityComparer.Vector3Int; - if (t.Equals(rangeIntType)) return (object)UnityEqualityComparer.RangeInt; - if (t.Equals(rectIntType)) return (object)UnityEqualityComparer.RectInt; - if (t.Equals(boundsIntType)) return (object)UnityEqualityComparer.BoundsInt; -#endif - - return null; - } - - sealed class Vector2EqualityComparer : IEqualityComparer - { - public bool Equals(Vector2 self, Vector2 vector) - { - return self.x.Equals(vector.x) && self.y.Equals(vector.y); - } - - public int GetHashCode(Vector2 obj) - { - return obj.x.GetHashCode() ^ obj.y.GetHashCode() << 2; - } - } - - sealed class Vector3EqualityComparer : IEqualityComparer - { - public bool Equals(Vector3 self, Vector3 vector) - { - return self.x.Equals(vector.x) && self.y.Equals(vector.y) && self.z.Equals(vector.z); - } - - public int GetHashCode(Vector3 obj) - { - return obj.x.GetHashCode() ^ obj.y.GetHashCode() << 2 ^ obj.z.GetHashCode() >> 2; - } - } - - sealed class Vector4EqualityComparer : IEqualityComparer - { - public bool Equals(Vector4 self, Vector4 vector) - { - return self.x.Equals(vector.x) && self.y.Equals(vector.y) && self.z.Equals(vector.z) && self.w.Equals(vector.w); - } - - public int GetHashCode(Vector4 obj) - { - return obj.x.GetHashCode() ^ obj.y.GetHashCode() << 2 ^ obj.z.GetHashCode() >> 2 ^ obj.w.GetHashCode() >> 1; - } - } - - sealed class ColorEqualityComparer : IEqualityComparer - { - public bool Equals(Color self, Color other) - { - return self.r.Equals(other.r) && self.g.Equals(other.g) && self.b.Equals(other.b) && self.a.Equals(other.a); - } - - public int GetHashCode(Color obj) - { - return obj.r.GetHashCode() ^ obj.g.GetHashCode() << 2 ^ obj.b.GetHashCode() >> 2 ^ obj.a.GetHashCode() >> 1; - } - } - - sealed class RectEqualityComparer : IEqualityComparer - { - public bool Equals(Rect self, Rect other) - { - return self.x.Equals(other.x) && self.width.Equals(other.width) && self.y.Equals(other.y) && self.height.Equals(other.height); - } - - public int GetHashCode(Rect obj) - { - return obj.x.GetHashCode() ^ obj.width.GetHashCode() << 2 ^ obj.y.GetHashCode() >> 2 ^ obj.height.GetHashCode() >> 1; - } - } - - sealed class BoundsEqualityComparer : IEqualityComparer - { - public bool Equals(Bounds self, Bounds vector) - { - return self.center.Equals(vector.center) && self.extents.Equals(vector.extents); - } - - public int GetHashCode(Bounds obj) - { - return obj.center.GetHashCode() ^ obj.extents.GetHashCode() << 2; - } - } - - sealed class QuaternionEqualityComparer : IEqualityComparer - { - public bool Equals(Quaternion self, Quaternion vector) - { - return self.x.Equals(vector.x) && self.y.Equals(vector.y) && self.z.Equals(vector.z) && self.w.Equals(vector.w); - } - - public int GetHashCode(Quaternion obj) - { - return obj.x.GetHashCode() ^ obj.y.GetHashCode() << 2 ^ obj.z.GetHashCode() >> 2 ^ obj.w.GetHashCode() >> 1; - } - } - - sealed class Color32EqualityComparer : IEqualityComparer - { - public bool Equals(Color32 self, Color32 vector) - { - return self.a.Equals(vector.a) && self.r.Equals(vector.r) && self.g.Equals(vector.g) && self.b.Equals(vector.b); - } - - public int GetHashCode(Color32 obj) - { - return obj.a.GetHashCode() ^ obj.r.GetHashCode() << 2 ^ obj.g.GetHashCode() >> 2 ^ obj.b.GetHashCode() >> 1; - } - } - -#if UNITY_2017_2_OR_NEWER - - sealed class Vector2IntEqualityComparer : IEqualityComparer - { - public bool Equals(Vector2Int self, Vector2Int vector) - { - return self.x.Equals(vector.x) && self.y.Equals(vector.y); - } - - public int GetHashCode(Vector2Int obj) - { - return obj.x.GetHashCode() ^ obj.y.GetHashCode() << 2; - } - } - - sealed class Vector3IntEqualityComparer : IEqualityComparer - { - public static readonly Vector3IntEqualityComparer Default = new Vector3IntEqualityComparer(); - - public bool Equals(Vector3Int self, Vector3Int vector) - { - return self.x.Equals(vector.x) && self.y.Equals(vector.y) && self.z.Equals(vector.z); - } - - public int GetHashCode(Vector3Int obj) - { - return obj.x.GetHashCode() ^ obj.y.GetHashCode() << 2 ^ obj.z.GetHashCode() >> 2; - } - } - - sealed class RangeIntEqualityComparer : IEqualityComparer - { - public bool Equals(RangeInt self, RangeInt vector) - { - return self.start.Equals(vector.start) && self.length.Equals(vector.length); - } - - public int GetHashCode(RangeInt obj) - { - return obj.start.GetHashCode() ^ obj.length.GetHashCode() << 2; - } - } - - sealed class RectIntEqualityComparer : IEqualityComparer - { - public bool Equals(RectInt self, RectInt other) - { - return self.x.Equals(other.x) && self.width.Equals(other.width) && self.y.Equals(other.y) && self.height.Equals(other.height); - } - - public int GetHashCode(RectInt obj) - { - return obj.x.GetHashCode() ^ obj.width.GetHashCode() << 2 ^ obj.y.GetHashCode() >> 2 ^ obj.height.GetHashCode() >> 1; - } - } - - sealed class BoundsIntEqualityComparer : IEqualityComparer - { - public bool Equals(BoundsInt self, BoundsInt vector) - { - return Vector3IntEqualityComparer.Default.Equals(self.position, vector.position) - && Vector3IntEqualityComparer.Default.Equals(self.size, vector.size); - } - - public int GetHashCode(BoundsInt obj) - { - return Vector3IntEqualityComparer.Default.GetHashCode(obj.position) ^ Vector3IntEqualityComparer.Default.GetHashCode(obj.size) << 2; - } - } - -#endif - } -} diff --git a/VirtueSky/UniTask/Runtime/Internal/UnityEqualityComparer.cs.meta b/VirtueSky/UniTask/Runtime/Internal/UnityEqualityComparer.cs.meta deleted file mode 100644 index 79eb04f6..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/UnityEqualityComparer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ebaaf14253c9cfb47b23283218ff9b67 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Internal/UnityWebRequestExtensions.cs b/VirtueSky/UniTask/Runtime/Internal/UnityWebRequestExtensions.cs deleted file mode 100644 index 74d32999..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/UnityWebRequestExtensions.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using UnityEngine.Networking; - -namespace VirtueSky.Threading.Tasks.Internal -{ -#if ENABLE_UNITYWEBREQUEST && (!UNITY_2019_1_OR_NEWER || UNITASK_WEBREQUEST_SUPPORT) - - internal static class UnityWebRequestResultExtensions - { - public static bool IsError(this UnityWebRequest unityWebRequest) - { -#if UNITY_2020_2_OR_NEWER - var result = unityWebRequest.result; - return (result == UnityWebRequest.Result.ConnectionError) - || (result == UnityWebRequest.Result.DataProcessingError) - || (result == UnityWebRequest.Result.ProtocolError); -#else - return unityWebRequest.isHttpError || unityWebRequest.isNetworkError; -#endif - } - } - -#endif -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Internal/UnityWebRequestExtensions.cs.meta b/VirtueSky/UniTask/Runtime/Internal/UnityWebRequestExtensions.cs.meta deleted file mode 100644 index 54bd2eb5..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/UnityWebRequestExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 111ba0e639de1d7428af6c823ead4918 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Internal/ValueStopwatch.cs b/VirtueSky/UniTask/Runtime/Internal/ValueStopwatch.cs deleted file mode 100644 index 2ac3319a..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/ValueStopwatch.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Diagnostics; - -namespace VirtueSky.Threading.Tasks.Internal -{ - internal readonly struct ValueStopwatch - { - static readonly double TimestampToTicks = TimeSpan.TicksPerSecond / (double)Stopwatch.Frequency; - - readonly long startTimestamp; - - public static ValueStopwatch StartNew() => new ValueStopwatch(Stopwatch.GetTimestamp()); - - ValueStopwatch(long startTimestamp) - { - this.startTimestamp = startTimestamp; - } - - public TimeSpan Elapsed => TimeSpan.FromTicks(this.ElapsedTicks); - - public bool IsInvalid => startTimestamp == 0; - - public long ElapsedTicks - { - get - { - if (startTimestamp == 0) - { - throw new InvalidOperationException("Detected invalid initialization(use 'default'), only to create from StartNew()."); - } - - var delta = Stopwatch.GetTimestamp() - startTimestamp; - return (long)(delta * TimestampToTicks); - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Internal/ValueStopwatch.cs.meta b/VirtueSky/UniTask/Runtime/Internal/ValueStopwatch.cs.meta deleted file mode 100644 index b7c6b09c..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/ValueStopwatch.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f16fb466974ad034c8732c79c7fd67ea -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Internal/WeakDictionary.cs b/VirtueSky/UniTask/Runtime/Internal/WeakDictionary.cs deleted file mode 100644 index fffc1650..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/WeakDictionary.cs +++ /dev/null @@ -1,334 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Internal -{ - // Add, Remove, Enumerate with sweep. All operations are thread safe(in spinlock). - internal class WeakDictionary - where TKey : class - { - Entry[] buckets; - int size; - SpinLock gate; // mutable struct(not readonly) - - readonly float loadFactor; - readonly IEqualityComparer keyEqualityComparer; - - public WeakDictionary(int capacity = 4, float loadFactor = 0.75f, IEqualityComparer keyComparer = null) - { - var tableSize = CalculateCapacity(capacity, loadFactor); - this.buckets = new Entry[tableSize]; - this.loadFactor = loadFactor; - this.gate = new SpinLock(false); - this.keyEqualityComparer = keyComparer ?? EqualityComparer.Default; - } - - public bool TryAdd(TKey key, TValue value) - { - bool lockTaken = false; - try - { - gate.Enter(ref lockTaken); - return TryAddInternal(key, value); - } - finally - { - if (lockTaken) gate.Exit(false); - } - } - - public bool TryGetValue(TKey key, out TValue value) - { - bool lockTaken = false; - try - { - gate.Enter(ref lockTaken); - if (TryGetEntry(key, out _, out var entry)) - { - value = entry.Value; - return true; - } - - value = default(TValue); - return false; - } - finally - { - if (lockTaken) gate.Exit(false); - } - } - - public bool TryRemove(TKey key) - { - bool lockTaken = false; - try - { - gate.Enter(ref lockTaken); - if (TryGetEntry(key, out var hashIndex, out var entry)) - { - Remove(hashIndex, entry); - return true; - } - - return false; - } - finally - { - if (lockTaken) gate.Exit(false); - } - } - - bool TryAddInternal(TKey key, TValue value) - { - var nextCapacity = CalculateCapacity(size + 1, loadFactor); - - TRY_ADD_AGAIN: - if (buckets.Length < nextCapacity) - { - // rehash - var nextBucket = new Entry[nextCapacity]; - for (int i = 0; i < buckets.Length; i++) - { - var e = buckets[i]; - while (e != null) - { - AddToBuckets(nextBucket, key, e.Value, e.Hash); - e = e.Next; - } - } - - buckets = nextBucket; - goto TRY_ADD_AGAIN; - } - else - { - // add entry - var successAdd = AddToBuckets(buckets, key, value, keyEqualityComparer.GetHashCode(key)); - if (successAdd) size++; - return successAdd; - } - } - - bool AddToBuckets(Entry[] targetBuckets, TKey newKey, TValue value, int keyHash) - { - var h = keyHash; - var hashIndex = h & (targetBuckets.Length - 1); - - TRY_ADD_AGAIN: - if (targetBuckets[hashIndex] == null) - { - targetBuckets[hashIndex] = new Entry - { - Key = new WeakReference(newKey, false), - Value = value, - Hash = h - }; - - return true; - } - else - { - // add to last. - var entry = targetBuckets[hashIndex]; - while (entry != null) - { - if (entry.Key.TryGetTarget(out var target)) - { - if (keyEqualityComparer.Equals(newKey, target)) - { - return false; // duplicate - } - } - else - { - Remove(hashIndex, entry); - if (targetBuckets[hashIndex] == null) goto TRY_ADD_AGAIN; // add new entry - } - - if (entry.Next != null) - { - entry = entry.Next; - } - else - { - // found last - entry.Next = new Entry - { - Key = new WeakReference(newKey, false), - Value = value, - Hash = h - }; - entry.Next.Prev = entry; - } - } - - return false; - } - } - - bool TryGetEntry(TKey key, out int hashIndex, out Entry entry) - { - var table = buckets; - var hash = keyEqualityComparer.GetHashCode(key); - hashIndex = hash & table.Length - 1; - entry = table[hashIndex]; - - while (entry != null) - { - if (entry.Key.TryGetTarget(out var target)) - { - if (keyEqualityComparer.Equals(key, target)) - { - return true; - } - } - else - { - // sweap - Remove(hashIndex, entry); - } - - entry = entry.Next; - } - - return false; - } - - void Remove(int hashIndex, Entry entry) - { - if (entry.Prev == null && entry.Next == null) - { - buckets[hashIndex] = null; - } - else - { - if (entry.Prev == null) - { - buckets[hashIndex] = entry.Next; - } - if (entry.Prev != null) - { - entry.Prev.Next = entry.Next; - } - if (entry.Next != null) - { - entry.Next.Prev = entry.Prev; - } - } - size--; - } - - public List> ToList() - { - var list = new List>(size); - ToList(ref list, false); - return list; - } - - // avoid allocate everytime. - public int ToList(ref List> list, bool clear = true) - { - if (clear) - { - list.Clear(); - } - - var listIndex = 0; - - bool lockTaken = false; - try - { - for (int i = 0; i < buckets.Length; i++) - { - var entry = buckets[i]; - while (entry != null) - { - if (entry.Key.TryGetTarget(out var target)) - { - var item = new KeyValuePair(target, entry.Value); - if (listIndex < list.Count) - { - list[listIndex++] = item; - } - else - { - list.Add(item); - listIndex++; - } - } - else - { - // sweap - Remove(i, entry); - } - - entry = entry.Next; - } - } - } - finally - { - if (lockTaken) gate.Exit(false); - } - - return listIndex; - } - - static int CalculateCapacity(int collectionSize, float loadFactor) - { - var size = (int)(((float)collectionSize) / loadFactor); - - size--; - size |= size >> 1; - size |= size >> 2; - size |= size >> 4; - size |= size >> 8; - size |= size >> 16; - size += 1; - - if (size < 8) - { - size = 8; - } - return size; - } - - class Entry - { - public WeakReference Key; - public TValue Value; - public int Hash; - public Entry Prev; - public Entry Next; - - // debug only - public override string ToString() - { - if (Key.TryGetTarget(out var target)) - { - return target + "(" + Count() + ")"; - } - else - { - return "(Dead)"; - } - } - - int Count() - { - var count = 1; - var n = this; - while (n.Next != null) - { - count++; - n = n.Next; - } - return count; - } - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/Internal/WeakDictionary.cs.meta b/VirtueSky/UniTask/Runtime/Internal/WeakDictionary.cs.meta deleted file mode 100644 index 9dc1672a..00000000 --- a/VirtueSky/UniTask/Runtime/Internal/WeakDictionary.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6c78563864409714593226af59bcb6f3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq.meta b/VirtueSky/UniTask/Runtime/Linq.meta deleted file mode 100644 index c1b342c5..00000000 --- a/VirtueSky/UniTask/Runtime/Linq.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ab00384e4aab45f4ea110599d62fe22d -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Aggregate.cs b/VirtueSky/UniTask/Runtime/Linq/Aggregate.cs deleted file mode 100644 index 1a599dcb..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Aggregate.cs +++ /dev/null @@ -1,318 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask AggregateAsync(this IUniTaskAsyncEnumerable source, Func accumulator, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(accumulator, nameof(accumulator)); - - return Aggregate.AggregateAsync(source, accumulator, cancellationToken); - } - - public static UniTask AggregateAsync(this IUniTaskAsyncEnumerable source, TAccumulate seed, Func accumulator, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(accumulator, nameof(accumulator)); - - return Aggregate.AggregateAsync(source, seed, accumulator, cancellationToken); - } - - public static UniTask AggregateAsync(this IUniTaskAsyncEnumerable source, TAccumulate seed, Func accumulator, Func resultSelector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(accumulator, nameof(accumulator)); - Error.ThrowArgumentNullException(accumulator, nameof(resultSelector)); - - return Aggregate.AggregateAsync(source, seed, accumulator, resultSelector, cancellationToken); - } - - public static UniTask AggregateAwaitAsync(this IUniTaskAsyncEnumerable source, Func> accumulator, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(accumulator, nameof(accumulator)); - - return Aggregate.AggregateAwaitAsync(source, accumulator, cancellationToken); - } - - public static UniTask AggregateAwaitAsync(this IUniTaskAsyncEnumerable source, TAccumulate seed, Func> accumulator, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(accumulator, nameof(accumulator)); - - return Aggregate.AggregateAwaitAsync(source, seed, accumulator, cancellationToken); - } - - public static UniTask AggregateAwaitAsync(this IUniTaskAsyncEnumerable source, TAccumulate seed, Func> accumulator, Func> resultSelector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(accumulator, nameof(accumulator)); - Error.ThrowArgumentNullException(accumulator, nameof(resultSelector)); - - return Aggregate.AggregateAwaitAsync(source, seed, accumulator, resultSelector, cancellationToken); - } - - public static UniTask AggregateAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> accumulator, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(accumulator, nameof(accumulator)); - - return Aggregate.AggregateAwaitWithCancellationAsync(source, accumulator, cancellationToken); - } - - public static UniTask AggregateAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, TAccumulate seed, Func> accumulator, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(accumulator, nameof(accumulator)); - - return Aggregate.AggregateAwaitWithCancellationAsync(source, seed, accumulator, cancellationToken); - } - - public static UniTask AggregateAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, TAccumulate seed, Func> accumulator, Func> resultSelector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(accumulator, nameof(accumulator)); - Error.ThrowArgumentNullException(accumulator, nameof(resultSelector)); - - return Aggregate.AggregateAwaitWithCancellationAsync(source, seed, accumulator, resultSelector, cancellationToken); - } - } - - internal static class Aggregate - { - internal static async UniTask AggregateAsync(IUniTaskAsyncEnumerable source, Func accumulator, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - TSource value; - if (await e.MoveNextAsync()) - { - value = e.Current; - } - else - { - throw Error.NoElements(); - } - - while (await e.MoveNextAsync()) - { - value = accumulator(value, e.Current); - } - return value; - - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - internal static async UniTask AggregateAsync(IUniTaskAsyncEnumerable source, TAccumulate seed, Func accumulator, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - TAccumulate value = seed; - while (await e.MoveNextAsync()) - { - value = accumulator(value, e.Current); - } - return value; - - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - internal static async UniTask AggregateAsync(IUniTaskAsyncEnumerable source, TAccumulate seed, Func accumulator, Func resultSelector, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - TAccumulate value = seed; - while (await e.MoveNextAsync()) - { - value = accumulator(value, e.Current); - } - return resultSelector(value); - - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - // with async - - internal static async UniTask AggregateAwaitAsync(IUniTaskAsyncEnumerable source, Func> accumulator, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - TSource value; - if (await e.MoveNextAsync()) - { - value = e.Current; - } - else - { - throw Error.NoElements(); - } - - while (await e.MoveNextAsync()) - { - value = await accumulator(value, e.Current); - } - return value; - - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - internal static async UniTask AggregateAwaitAsync(IUniTaskAsyncEnumerable source, TAccumulate seed, Func> accumulator, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - TAccumulate value = seed; - while (await e.MoveNextAsync()) - { - value = await accumulator(value, e.Current); - } - return value; - - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - internal static async UniTask AggregateAwaitAsync(IUniTaskAsyncEnumerable source, TAccumulate seed, Func> accumulator, Func> resultSelector, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - TAccumulate value = seed; - while (await e.MoveNextAsync()) - { - value = await accumulator(value, e.Current); - } - return await resultSelector(value); - - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - - // with cancellation - - internal static async UniTask AggregateAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> accumulator, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - TSource value; - if (await e.MoveNextAsync()) - { - value = e.Current; - } - else - { - throw Error.NoElements(); - } - - while (await e.MoveNextAsync()) - { - value = await accumulator(value, e.Current, cancellationToken); - } - return value; - - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - internal static async UniTask AggregateAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, TAccumulate seed, Func> accumulator, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - TAccumulate value = seed; - while (await e.MoveNextAsync()) - { - value = await accumulator(value, e.Current, cancellationToken); - } - return value; - - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - internal static async UniTask AggregateAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, TAccumulate seed, Func> accumulator, Func> resultSelector, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - TAccumulate value = seed; - while (await e.MoveNextAsync()) - { - value = await accumulator(value, e.Current, cancellationToken); - } - return await resultSelector(value, cancellationToken); - - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Aggregate.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Aggregate.cs.meta deleted file mode 100644 index 837df4a9..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Aggregate.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5dc68c05a4228c643937f6ebd185bcca -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/All.cs b/VirtueSky/UniTask/Runtime/Linq/All.cs deleted file mode 100644 index 5caacf22..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/All.cs +++ /dev/null @@ -1,108 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask AllAsync(this IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return All.AllAsync(source, predicate, cancellationToken); - } - - public static UniTask AllAwaitAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return All.AllAwaitAsync(source, predicate, cancellationToken); - } - - public static UniTask AllAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return All.AllAwaitWithCancellationAsync(source, predicate, cancellationToken); - } - } - - internal static class All - { - internal static async UniTask AllAsync(IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - if (!predicate(e.Current)) - { - return false; - } - } - - return true; - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - internal static async UniTask AllAwaitAsync(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - if (!await predicate(e.Current)) - { - return false; - } - } - - return true; - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - internal static async UniTask AllAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - if (!await predicate(e.Current, cancellationToken)) - { - return false; - } - } - - return true; - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/All.cs.meta b/VirtueSky/UniTask/Runtime/Linq/All.cs.meta deleted file mode 100644 index d378ff0e..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/All.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7271437e0033af2448b600ee248924dd -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Any.cs b/VirtueSky/UniTask/Runtime/Linq/Any.cs deleted file mode 100644 index 522d0c4e..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Any.cs +++ /dev/null @@ -1,136 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask AnyAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Any.AnyAsync(source, cancellationToken); - } - - public static UniTask AnyAsync(this IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return Any.AnyAsync(source, predicate, cancellationToken); - } - - public static UniTask AnyAwaitAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return Any.AnyAwaitAsync(source, predicate, cancellationToken); - } - - public static UniTask AnyAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return Any.AnyAwaitWithCancellationAsync(source, predicate, cancellationToken); - } - } - - internal static class Any - { - internal static async UniTask AnyAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - if (await e.MoveNextAsync()) - { - return true; - } - - return false; - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - internal static async UniTask AnyAsync(IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - if (predicate(e.Current)) - { - return true; - } - } - - return false; - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - internal static async UniTask AnyAwaitAsync(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - if (await predicate(e.Current)) - { - return true; - } - } - - return false; - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - internal static async UniTask AnyAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - if (await predicate(e.Current, cancellationToken)) - { - return true; - } - } - - return false; - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Any.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Any.cs.meta deleted file mode 100644 index 1070bcc8..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Any.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e2b2e65745263994fbe34f3e0ec8eb12 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/AppendPrepend.cs b/VirtueSky/UniTask/Runtime/Linq/AppendPrepend.cs deleted file mode 100644 index 56cbebee..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/AppendPrepend.cs +++ /dev/null @@ -1,151 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Append(this IUniTaskAsyncEnumerable source, TSource element) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return new AppendPrepend(source, element, true); - } - - public static IUniTaskAsyncEnumerable Prepend(this IUniTaskAsyncEnumerable source, TSource element) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return new AppendPrepend(source, element, false); - } - } - - internal sealed class AppendPrepend : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly TSource element; - readonly bool append; // or prepend - - public AppendPrepend(IUniTaskAsyncEnumerable source, TSource element, bool append) - { - this.source = source; - this.element = element; - this.append = append; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _AppendPrepend(source, element, append, cancellationToken); - } - - sealed class _AppendPrepend : MoveNextSource, IUniTaskAsyncEnumerator - { - enum State : byte - { - None, - RequirePrepend, - RequireAppend, - Completed - } - - static readonly Action MoveNextCoreDelegate = MoveNextCore; - - readonly IUniTaskAsyncEnumerable source; - readonly TSource element; - CancellationToken cancellationToken; - - State state; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - - public _AppendPrepend(IUniTaskAsyncEnumerable source, TSource element, bool append, CancellationToken cancellationToken) - { - this.source = source; - this.element = element; - this.state = append ? State.RequireAppend : State.RequirePrepend; - this.cancellationToken = cancellationToken; - - TaskTracker.TrackActiveTask(this, 3); - } - - public TSource Current { get; private set; } - - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - completionSource.Reset(); - - if (enumerator == null) - { - if (state == State.RequirePrepend) - { - Current = element; - state = State.None; - return CompletedTasks.True; - } - - enumerator = source.GetAsyncEnumerator(cancellationToken); - } - - if (state == State.Completed) - { - return CompletedTasks.False; - } - - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - - if (awaiter.IsCompleted) - { - MoveNextCoreDelegate(this); - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - - return new UniTask(this, completionSource.Version); - } - - static void MoveNextCore(object state) - { - var self = (_AppendPrepend)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - self.Current = self.enumerator.Current; - self.completionSource.TrySetResult(true); - } - else - { - if (self.state == State.RequireAppend) - { - self.state = State.Completed; - self.Current = self.element; - self.completionSource.TrySetResult(true); - } - else - { - self.state = State.Completed; - self.completionSource.TrySetResult(false); - } - } - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - return default; - } - } - } - -} diff --git a/VirtueSky/UniTask/Runtime/Linq/AppendPrepend.cs.meta b/VirtueSky/UniTask/Runtime/Linq/AppendPrepend.cs.meta deleted file mode 100644 index 6d2ee046..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/AppendPrepend.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3268ec424b8055f45aa2a26d17c80468 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/AsUniTaskAsyncEnumerable.cs b/VirtueSky/UniTask/Runtime/Linq/AsUniTaskAsyncEnumerable.cs deleted file mode 100644 index 56eb326a..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/AsUniTaskAsyncEnumerable.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable AsUniTaskAsyncEnumerable(this IUniTaskAsyncEnumerable source) - { - return source; - } - } -} diff --git a/VirtueSky/UniTask/Runtime/Linq/AsUniTaskAsyncEnumerable.cs.meta b/VirtueSky/UniTask/Runtime/Linq/AsUniTaskAsyncEnumerable.cs.meta deleted file mode 100644 index 90f6207c..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/AsUniTaskAsyncEnumerable.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 69866e262589ea643bbc62a1d696077a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/AsyncEnumeratorBase.cs b/VirtueSky/UniTask/Runtime/Linq/AsyncEnumeratorBase.cs deleted file mode 100644 index c2796f29..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/AsyncEnumeratorBase.cs +++ /dev/null @@ -1,356 +0,0 @@ -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - // note: refactor all inherit class and should remove this. - // see Select and Where. - internal abstract class AsyncEnumeratorBase : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action moveNextCallbackDelegate = MoveNextCallBack; - - readonly IUniTaskAsyncEnumerable source; - protected CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter sourceMoveNext; - - public AsyncEnumeratorBase(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - this.source = source; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 4); - } - - // abstract - - /// - /// If return value is false, continue source.MoveNext. - /// - protected abstract bool TryMoveNextCore(bool sourceHasCurrent, out bool result); - - // Util - protected TSource SourceCurrent => enumerator.Current; - - // IUniTaskAsyncEnumerator - - public TResult Current { get; protected set; } - - public UniTask MoveNextAsync() - { - if (enumerator == null) - { - enumerator = source.GetAsyncEnumerator(cancellationToken); - } - - completionSource.Reset(); - if (!OnFirstIteration()) - { - SourceMoveNext(); - } - return new UniTask(this, completionSource.Version); - } - - protected virtual bool OnFirstIteration() - { - return false; - } - - protected void SourceMoveNext() - { - CONTINUE: - sourceMoveNext = enumerator.MoveNextAsync().GetAwaiter(); - if (sourceMoveNext.IsCompleted) - { - bool result = false; - try - { - if (!TryMoveNextCore(sourceMoveNext.GetResult(), out result)) - { - goto CONTINUE; - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - - if (cancellationToken.IsCancellationRequested) - { - completionSource.TrySetCanceled(cancellationToken); - } - else - { - completionSource.TrySetResult(result); - } - } - else - { - sourceMoveNext.SourceOnCompleted(moveNextCallbackDelegate, this); - } - } - - static void MoveNextCallBack(object state) - { - var self = (AsyncEnumeratorBase)state; - bool result; - try - { - if (!self.TryMoveNextCore(self.sourceMoveNext.GetResult(), out result)) - { - self.SourceMoveNext(); - return; - } - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - return; - } - - if (self.cancellationToken.IsCancellationRequested) - { - self.completionSource.TrySetCanceled(self.cancellationToken); - } - else - { - self.completionSource.TrySetResult(result); - } - } - - // if require additional resource to dispose, override and call base.DisposeAsync. - public virtual UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - return default; - } - } - - internal abstract class AsyncEnumeratorAwaitSelectorBase : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action moveNextCallbackDelegate = MoveNextCallBack; - static readonly Action setCurrentCallbackDelegate = SetCurrentCallBack; - - - readonly IUniTaskAsyncEnumerable source; - protected CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter sourceMoveNext; - - UniTask.Awaiter resultAwaiter; - - public AsyncEnumeratorAwaitSelectorBase(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - this.source = source; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 4); - } - - // abstract - - protected abstract UniTask TransformAsync(TSource sourceCurrent); - protected abstract bool TrySetCurrentCore(TAwait awaitResult, out bool terminateIteration); - - // Util - protected TSource SourceCurrent { get; private set; } - - protected (bool waitCallback, bool requireNextIteration) ActionCompleted(bool trySetCurrentResult, out bool moveNextResult) - { - if (trySetCurrentResult) - { - moveNextResult = true; - return (false, false); - } - else - { - moveNextResult = default; - return (false, true); - } - } - protected (bool waitCallback, bool requireNextIteration) WaitAwaitCallback(out bool moveNextResult) { moveNextResult = default; return (true, false); } - protected (bool waitCallback, bool requireNextIteration) IterateFinished(out bool moveNextResult) { moveNextResult = false; return (false, false); } - - // IUniTaskAsyncEnumerator - - public TResult Current { get; protected set; } - - public UniTask MoveNextAsync() - { - if (enumerator == null) - { - enumerator = source.GetAsyncEnumerator(cancellationToken); - } - - completionSource.Reset(); - SourceMoveNext(); - return new UniTask(this, completionSource.Version); - } - - protected void SourceMoveNext() - { - CONTINUE: - sourceMoveNext = enumerator.MoveNextAsync().GetAwaiter(); - if (sourceMoveNext.IsCompleted) - { - bool result = false; - try - { - (bool waitCallback, bool requireNextIteration) = TryMoveNextCore(sourceMoveNext.GetResult(), out result); - - if (waitCallback) - { - return; - } - - if (requireNextIteration) - { - goto CONTINUE; - } - else - { - completionSource.TrySetResult(result); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - } - else - { - sourceMoveNext.SourceOnCompleted(moveNextCallbackDelegate, this); - } - } - - (bool waitCallback, bool requireNextIteration) TryMoveNextCore(bool sourceHasCurrent, out bool result) - { - if (sourceHasCurrent) - { - SourceCurrent = enumerator.Current; - var task = TransformAsync(SourceCurrent); - if (UnwarapTask(task, out var taskResult)) - { - var currentResult = TrySetCurrentCore(taskResult, out var terminateIteration); - if (terminateIteration) - { - return IterateFinished(out result); - } - - return ActionCompleted(currentResult, out result); - } - else - { - return WaitAwaitCallback(out result); - } - } - - return IterateFinished(out result); - } - - protected bool UnwarapTask(UniTask taskResult, out TAwait result) - { - resultAwaiter = taskResult.GetAwaiter(); - - if (resultAwaiter.IsCompleted) - { - result = resultAwaiter.GetResult(); - return true; - } - else - { - resultAwaiter.SourceOnCompleted(setCurrentCallbackDelegate, this); - result = default; - return false; - } - } - - static void MoveNextCallBack(object state) - { - var self = (AsyncEnumeratorAwaitSelectorBase)state; - bool result = false; - try - { - (bool waitCallback, bool requireNextIteration) = self.TryMoveNextCore(self.sourceMoveNext.GetResult(), out result); - - if (waitCallback) - { - return; - } - - if (requireNextIteration) - { - self.SourceMoveNext(); - return; - } - else - { - self.completionSource.TrySetResult(result); - } - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - return; - } - } - - static void SetCurrentCallBack(object state) - { - var self = (AsyncEnumeratorAwaitSelectorBase)state; - - bool doneSetCurrent; - bool terminateIteration; - try - { - var result = self.resultAwaiter.GetResult(); - doneSetCurrent = self.TrySetCurrentCore(result, out terminateIteration); - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - return; - } - - if (self.cancellationToken.IsCancellationRequested) - { - self.completionSource.TrySetCanceled(self.cancellationToken); - } - else - { - if (doneSetCurrent) - { - self.completionSource.TrySetResult(true); - } - else - { - if (terminateIteration) - { - self.completionSource.TrySetResult(false); - } - else - { - self.SourceMoveNext(); - } - } - } - } - - // if require additional resource to dispose, override and call base.DisposeAsync. - public virtual UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - return default; - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/AsyncEnumeratorBase.cs.meta b/VirtueSky/UniTask/Runtime/Linq/AsyncEnumeratorBase.cs.meta deleted file mode 100644 index a4e96dc0..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/AsyncEnumeratorBase.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 01ba1d3b17e13fb4c95740131c7e6e19 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Average.cs b/VirtueSky/UniTask/Runtime/Linq/Average.cs deleted file mode 100644 index d861a931..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Average.cs +++ /dev/null @@ -1,1524 +0,0 @@ -using System; -using System.Threading; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Average.AverageAsync(source, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Average.AverageAsync(source, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Average.AverageAsync(source, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Average.AverageAsync(source, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Average.AverageAsync(source, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Average.AverageAsync(source, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Average.AverageAsync(source, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Average.AverageAsync(source, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Average.AverageAsync(source, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Average.AverageAsync(source, cancellationToken); - } - - public static UniTask AverageAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask AverageAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Average.AverageAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - } - - internal static class Average - { - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - long count = 0; - Int32 sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += e.Current; - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (double)sum / count; - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - long count = 0; - Int32 sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += selector(e.Current); - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (double)sum / count; - } - - public static async UniTask AverageAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Int32 sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += await selector(e.Current); - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (double)sum / count; - } - - public static async UniTask AverageAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Int32 sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += await selector(e.Current, cancellationToken); - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (double)sum / count; - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - long count = 0; - Int64 sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += e.Current; - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (double)sum / count; - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - long count = 0; - Int64 sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += selector(e.Current); - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (double)sum / count; - } - - public static async UniTask AverageAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Int64 sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += await selector(e.Current); - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (double)sum / count; - } - - public static async UniTask AverageAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Int64 sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += await selector(e.Current, cancellationToken); - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (double)sum / count; - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - long count = 0; - Single sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += e.Current; - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (float)(sum / count); - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - long count = 0; - Single sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += selector(e.Current); - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (float)(sum / count); - } - - public static async UniTask AverageAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Single sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += await selector(e.Current); - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (float)(sum / count); - } - - public static async UniTask AverageAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Single sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += await selector(e.Current, cancellationToken); - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (float)(sum / count); - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - long count = 0; - Double sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += e.Current; - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum / count; - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - long count = 0; - Double sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += selector(e.Current); - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum / count; - } - - public static async UniTask AverageAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Double sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += await selector(e.Current); - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum / count; - } - - public static async UniTask AverageAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Double sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += await selector(e.Current, cancellationToken); - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum / count; - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - long count = 0; - Decimal sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += e.Current; - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum / count; - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - long count = 0; - Decimal sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += selector(e.Current); - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum / count; - } - - public static async UniTask AverageAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Decimal sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += await selector(e.Current); - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum / count; - } - - public static async UniTask AverageAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Decimal sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked - { - sum += await selector(e.Current, cancellationToken); - count++; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum / count; - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - long count = 0; - Int32? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = e.Current; - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (double)sum / count; - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - long count = 0; - Int32? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = selector(e.Current); - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (double)sum / count; - } - - public static async UniTask AverageAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Int32? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = await selector(e.Current); - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (double)sum / count; - } - - public static async UniTask AverageAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Int32? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = await selector(e.Current, cancellationToken); - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (double)sum / count; - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - long count = 0; - Int64? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = e.Current; - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (double)sum / count; - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - long count = 0; - Int64? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = selector(e.Current); - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (double)sum / count; - } - - public static async UniTask AverageAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Int64? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = await selector(e.Current); - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (double)sum / count; - } - - public static async UniTask AverageAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Int64? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = await selector(e.Current, cancellationToken); - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (double)sum / count; - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - long count = 0; - Single? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = e.Current; - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (float)(sum / count); - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - long count = 0; - Single? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = selector(e.Current); - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (float)(sum / count); - } - - public static async UniTask AverageAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Single? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = await selector(e.Current); - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (float)(sum / count); - } - - public static async UniTask AverageAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Single? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = await selector(e.Current, cancellationToken); - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return (float)(sum / count); - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - long count = 0; - Double? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = e.Current; - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum / count; - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - long count = 0; - Double? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = selector(e.Current); - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum / count; - } - - public static async UniTask AverageAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Double? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = await selector(e.Current); - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum / count; - } - - public static async UniTask AverageAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Double? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = await selector(e.Current, cancellationToken); - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum / count; - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - long count = 0; - Decimal? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = e.Current; - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum / count; - } - - public static async UniTask AverageAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - long count = 0; - Decimal? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = selector(e.Current); - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum / count; - } - - public static async UniTask AverageAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Decimal? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = await selector(e.Current); - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum / count; - } - - public static async UniTask AverageAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - long count = 0; - Decimal? sum = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = await selector(e.Current, cancellationToken); - if (v.HasValue) - { - checked - { - sum += v.Value; - count++; - } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum / count; - } - - } -} diff --git a/VirtueSky/UniTask/Runtime/Linq/Average.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Average.cs.meta deleted file mode 100644 index 8f60dfc5..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Average.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 58499f95012fb3c47bb7bcbc5862e562 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Buffer.cs b/VirtueSky/UniTask/Runtime/Linq/Buffer.cs deleted file mode 100644 index 4a553046..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Buffer.cs +++ /dev/null @@ -1,345 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable> Buffer(this IUniTaskAsyncEnumerable source, Int32 count) - { - Error.ThrowArgumentNullException(source, nameof(source)); - if (count <= 0) throw Error.ArgumentOutOfRange(nameof(count)); - - return new Buffer(source, count); - } - - public static IUniTaskAsyncEnumerable> Buffer(this IUniTaskAsyncEnumerable source, Int32 count, Int32 skip) - { - Error.ThrowArgumentNullException(source, nameof(source)); - if (count <= 0) throw Error.ArgumentOutOfRange(nameof(count)); - if (skip <= 0) throw Error.ArgumentOutOfRange(nameof(skip)); - - return new BufferSkip(source, count, skip); - } - } - - internal sealed class Buffer : IUniTaskAsyncEnumerable> - { - readonly IUniTaskAsyncEnumerable source; - readonly int count; - - public Buffer(IUniTaskAsyncEnumerable source, int count) - { - this.source = source; - this.count = count; - } - - public IUniTaskAsyncEnumerator> GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Buffer(source, count, cancellationToken); - } - - sealed class _Buffer : MoveNextSource, IUniTaskAsyncEnumerator> - { - static readonly Action MoveNextCoreDelegate = MoveNextCore; - - readonly IUniTaskAsyncEnumerable source; - readonly int count; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - bool continueNext; - - bool completed; - List buffer; - - public _Buffer(IUniTaskAsyncEnumerable source, int count, CancellationToken cancellationToken) - { - this.source = source; - this.count = count; - this.cancellationToken = cancellationToken; - - TaskTracker.TrackActiveTask(this, 3); - } - - public IList Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - - if (enumerator == null) - { - enumerator = source.GetAsyncEnumerator(cancellationToken); - buffer = new List(count); - } - - completionSource.Reset(); - SourceMoveNext(); - return new UniTask(this, completionSource.Version); - } - - void SourceMoveNext() - { - if (completed) - { - if (buffer != null && buffer.Count > 0) - { - var ret = buffer; - buffer = null; - Current = ret; - completionSource.TrySetResult(true); - return; - } - else - { - completionSource.TrySetResult(false); - return; - } - } - - try - { - - LOOP: - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - continueNext = true; - MoveNextCore(this); - if (continueNext) - { - continueNext = false; - goto LOOP; // avoid recursive - } - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - } - - - static void MoveNextCore(object state) - { - var self = (_Buffer)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - self.buffer.Add(self.enumerator.Current); - - if (self.buffer.Count == self.count) - { - self.Current = self.buffer; - self.buffer = new List(self.count); - self.continueNext = false; - self.completionSource.TrySetResult(true); - return; - } - else - { - if (!self.continueNext) - { - self.SourceMoveNext(); - } - } - } - else - { - self.continueNext = false; - self.completed = true; - self.SourceMoveNext(); - } - } - else - { - self.continueNext = false; - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - return default; - } - } - } - - internal sealed class BufferSkip : IUniTaskAsyncEnumerable> - { - readonly IUniTaskAsyncEnumerable source; - readonly int count; - readonly int skip; - - public BufferSkip(IUniTaskAsyncEnumerable source, int count, int skip) - { - this.source = source; - this.count = count; - this.skip = skip; - } - - public IUniTaskAsyncEnumerator> GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _BufferSkip(source, count, skip, cancellationToken); - } - - sealed class _BufferSkip : MoveNextSource, IUniTaskAsyncEnumerator> - { - static readonly Action MoveNextCoreDelegate = MoveNextCore; - - readonly IUniTaskAsyncEnumerable source; - readonly int count; - readonly int skip; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - bool continueNext; - - bool completed; - Queue> buffers; - int index = 0; - - public _BufferSkip(IUniTaskAsyncEnumerable source, int count, int skip, CancellationToken cancellationToken) - { - this.source = source; - this.count = count; - this.skip = skip; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public IList Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - - if (enumerator == null) - { - enumerator = source.GetAsyncEnumerator(cancellationToken); - buffers = new Queue>(); - } - - completionSource.Reset(); - SourceMoveNext(); - return new UniTask(this, completionSource.Version); - } - - void SourceMoveNext() - { - if (completed) - { - if (buffers.Count > 0) - { - Current = buffers.Dequeue(); - completionSource.TrySetResult(true); - return; - } - else - { - completionSource.TrySetResult(false); - return; - } - } - - try - { - - LOOP: - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - continueNext = true; - MoveNextCore(this); - if (continueNext) - { - continueNext = false; - goto LOOP; // avoid recursive - } - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - } - - - static void MoveNextCore(object state) - { - var self = (_BufferSkip)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - if (self.index++ % self.skip == 0) - { - self.buffers.Enqueue(new List(self.count)); - } - - var item = self.enumerator.Current; - foreach (var buffer in self.buffers) - { - buffer.Add(item); - } - - if (self.buffers.Count > 0 && self.buffers.Peek().Count == self.count) - { - self.Current = self.buffers.Dequeue(); - self.continueNext = false; - self.completionSource.TrySetResult(true); - return; - } - else - { - if (!self.continueNext) - { - self.SourceMoveNext(); - } - } - } - else - { - self.continueNext = false; - self.completed = true; - self.SourceMoveNext(); - } - } - else - { - self.continueNext = false; - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Buffer.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Buffer.cs.meta deleted file mode 100644 index e7154e4d..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Buffer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 951310243334a3148a7872977cb31c5c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Cast.cs b/VirtueSky/UniTask/Runtime/Linq/Cast.cs deleted file mode 100644 index 7eb8a08e..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Cast.cs +++ /dev/null @@ -1,53 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Cast(this IUniTaskAsyncEnumerable source) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return new Cast(source); - } - } - - internal sealed class Cast : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - - public Cast(IUniTaskAsyncEnumerable source) - { - this.source = source; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Cast(source, cancellationToken); - } - - class _Cast : AsyncEnumeratorBase - { - public _Cast(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - - : base(source, cancellationToken) - { - } - - protected override bool TryMoveNextCore(bool sourceHasCurrent, out bool result) - { - if (sourceHasCurrent) - { - Current = (TResult)SourceCurrent; - result = true; - return true; - } - - result = false; - return true; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Cast.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Cast.cs.meta deleted file mode 100644 index 913b043c..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Cast.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: edebeae8b61352b428abe9ce8f3fc71a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/CombineLatest.cs b/VirtueSky/UniTask/Runtime/Linq/CombineLatest.cs deleted file mode 100644 index d08caa88..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/CombineLatest.cs +++ /dev/null @@ -1,11372 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable CombineLatest(this IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, Func resultSelector) - { - Error.ThrowArgumentNullException(source1, nameof(source1)); - Error.ThrowArgumentNullException(source2, nameof(source2)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new CombineLatest(source1, source2, resultSelector); - } - - public static IUniTaskAsyncEnumerable CombineLatest(this IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, Func resultSelector) - { - Error.ThrowArgumentNullException(source1, nameof(source1)); - Error.ThrowArgumentNullException(source2, nameof(source2)); - Error.ThrowArgumentNullException(source3, nameof(source3)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new CombineLatest(source1, source2, source3, resultSelector); - } - - public static IUniTaskAsyncEnumerable CombineLatest(this IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, Func resultSelector) - { - Error.ThrowArgumentNullException(source1, nameof(source1)); - Error.ThrowArgumentNullException(source2, nameof(source2)); - Error.ThrowArgumentNullException(source3, nameof(source3)); - Error.ThrowArgumentNullException(source4, nameof(source4)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new CombineLatest(source1, source2, source3, source4, resultSelector); - } - - public static IUniTaskAsyncEnumerable CombineLatest(this IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, Func resultSelector) - { - Error.ThrowArgumentNullException(source1, nameof(source1)); - Error.ThrowArgumentNullException(source2, nameof(source2)); - Error.ThrowArgumentNullException(source3, nameof(source3)); - Error.ThrowArgumentNullException(source4, nameof(source4)); - Error.ThrowArgumentNullException(source5, nameof(source5)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new CombineLatest(source1, source2, source3, source4, source5, resultSelector); - } - - public static IUniTaskAsyncEnumerable CombineLatest(this IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, Func resultSelector) - { - Error.ThrowArgumentNullException(source1, nameof(source1)); - Error.ThrowArgumentNullException(source2, nameof(source2)); - Error.ThrowArgumentNullException(source3, nameof(source3)); - Error.ThrowArgumentNullException(source4, nameof(source4)); - Error.ThrowArgumentNullException(source5, nameof(source5)); - Error.ThrowArgumentNullException(source6, nameof(source6)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new CombineLatest(source1, source2, source3, source4, source5, source6, resultSelector); - } - - public static IUniTaskAsyncEnumerable CombineLatest(this IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, Func resultSelector) - { - Error.ThrowArgumentNullException(source1, nameof(source1)); - Error.ThrowArgumentNullException(source2, nameof(source2)); - Error.ThrowArgumentNullException(source3, nameof(source3)); - Error.ThrowArgumentNullException(source4, nameof(source4)); - Error.ThrowArgumentNullException(source5, nameof(source5)); - Error.ThrowArgumentNullException(source6, nameof(source6)); - Error.ThrowArgumentNullException(source7, nameof(source7)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new CombineLatest(source1, source2, source3, source4, source5, source6, source7, resultSelector); - } - - public static IUniTaskAsyncEnumerable CombineLatest(this IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, Func resultSelector) - { - Error.ThrowArgumentNullException(source1, nameof(source1)); - Error.ThrowArgumentNullException(source2, nameof(source2)); - Error.ThrowArgumentNullException(source3, nameof(source3)); - Error.ThrowArgumentNullException(source4, nameof(source4)); - Error.ThrowArgumentNullException(source5, nameof(source5)); - Error.ThrowArgumentNullException(source6, nameof(source6)); - Error.ThrowArgumentNullException(source7, nameof(source7)); - Error.ThrowArgumentNullException(source8, nameof(source8)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new CombineLatest(source1, source2, source3, source4, source5, source6, source7, source8, resultSelector); - } - - public static IUniTaskAsyncEnumerable CombineLatest(this IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, Func resultSelector) - { - Error.ThrowArgumentNullException(source1, nameof(source1)); - Error.ThrowArgumentNullException(source2, nameof(source2)); - Error.ThrowArgumentNullException(source3, nameof(source3)); - Error.ThrowArgumentNullException(source4, nameof(source4)); - Error.ThrowArgumentNullException(source5, nameof(source5)); - Error.ThrowArgumentNullException(source6, nameof(source6)); - Error.ThrowArgumentNullException(source7, nameof(source7)); - Error.ThrowArgumentNullException(source8, nameof(source8)); - Error.ThrowArgumentNullException(source9, nameof(source9)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new CombineLatest(source1, source2, source3, source4, source5, source6, source7, source8, source9, resultSelector); - } - - public static IUniTaskAsyncEnumerable CombineLatest(this IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, IUniTaskAsyncEnumerable source10, Func resultSelector) - { - Error.ThrowArgumentNullException(source1, nameof(source1)); - Error.ThrowArgumentNullException(source2, nameof(source2)); - Error.ThrowArgumentNullException(source3, nameof(source3)); - Error.ThrowArgumentNullException(source4, nameof(source4)); - Error.ThrowArgumentNullException(source5, nameof(source5)); - Error.ThrowArgumentNullException(source6, nameof(source6)); - Error.ThrowArgumentNullException(source7, nameof(source7)); - Error.ThrowArgumentNullException(source8, nameof(source8)); - Error.ThrowArgumentNullException(source9, nameof(source9)); - Error.ThrowArgumentNullException(source10, nameof(source10)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new CombineLatest(source1, source2, source3, source4, source5, source6, source7, source8, source9, source10, resultSelector); - } - - public static IUniTaskAsyncEnumerable CombineLatest(this IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, IUniTaskAsyncEnumerable source10, IUniTaskAsyncEnumerable source11, Func resultSelector) - { - Error.ThrowArgumentNullException(source1, nameof(source1)); - Error.ThrowArgumentNullException(source2, nameof(source2)); - Error.ThrowArgumentNullException(source3, nameof(source3)); - Error.ThrowArgumentNullException(source4, nameof(source4)); - Error.ThrowArgumentNullException(source5, nameof(source5)); - Error.ThrowArgumentNullException(source6, nameof(source6)); - Error.ThrowArgumentNullException(source7, nameof(source7)); - Error.ThrowArgumentNullException(source8, nameof(source8)); - Error.ThrowArgumentNullException(source9, nameof(source9)); - Error.ThrowArgumentNullException(source10, nameof(source10)); - Error.ThrowArgumentNullException(source11, nameof(source11)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new CombineLatest(source1, source2, source3, source4, source5, source6, source7, source8, source9, source10, source11, resultSelector); - } - - public static IUniTaskAsyncEnumerable CombineLatest(this IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, IUniTaskAsyncEnumerable source10, IUniTaskAsyncEnumerable source11, IUniTaskAsyncEnumerable source12, Func resultSelector) - { - Error.ThrowArgumentNullException(source1, nameof(source1)); - Error.ThrowArgumentNullException(source2, nameof(source2)); - Error.ThrowArgumentNullException(source3, nameof(source3)); - Error.ThrowArgumentNullException(source4, nameof(source4)); - Error.ThrowArgumentNullException(source5, nameof(source5)); - Error.ThrowArgumentNullException(source6, nameof(source6)); - Error.ThrowArgumentNullException(source7, nameof(source7)); - Error.ThrowArgumentNullException(source8, nameof(source8)); - Error.ThrowArgumentNullException(source9, nameof(source9)); - Error.ThrowArgumentNullException(source10, nameof(source10)); - Error.ThrowArgumentNullException(source11, nameof(source11)); - Error.ThrowArgumentNullException(source12, nameof(source12)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new CombineLatest(source1, source2, source3, source4, source5, source6, source7, source8, source9, source10, source11, source12, resultSelector); - } - - public static IUniTaskAsyncEnumerable CombineLatest(this IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, IUniTaskAsyncEnumerable source10, IUniTaskAsyncEnumerable source11, IUniTaskAsyncEnumerable source12, IUniTaskAsyncEnumerable source13, Func resultSelector) - { - Error.ThrowArgumentNullException(source1, nameof(source1)); - Error.ThrowArgumentNullException(source2, nameof(source2)); - Error.ThrowArgumentNullException(source3, nameof(source3)); - Error.ThrowArgumentNullException(source4, nameof(source4)); - Error.ThrowArgumentNullException(source5, nameof(source5)); - Error.ThrowArgumentNullException(source6, nameof(source6)); - Error.ThrowArgumentNullException(source7, nameof(source7)); - Error.ThrowArgumentNullException(source8, nameof(source8)); - Error.ThrowArgumentNullException(source9, nameof(source9)); - Error.ThrowArgumentNullException(source10, nameof(source10)); - Error.ThrowArgumentNullException(source11, nameof(source11)); - Error.ThrowArgumentNullException(source12, nameof(source12)); - Error.ThrowArgumentNullException(source13, nameof(source13)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new CombineLatest(source1, source2, source3, source4, source5, source6, source7, source8, source9, source10, source11, source12, source13, resultSelector); - } - - public static IUniTaskAsyncEnumerable CombineLatest(this IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, IUniTaskAsyncEnumerable source10, IUniTaskAsyncEnumerable source11, IUniTaskAsyncEnumerable source12, IUniTaskAsyncEnumerable source13, IUniTaskAsyncEnumerable source14, Func resultSelector) - { - Error.ThrowArgumentNullException(source1, nameof(source1)); - Error.ThrowArgumentNullException(source2, nameof(source2)); - Error.ThrowArgumentNullException(source3, nameof(source3)); - Error.ThrowArgumentNullException(source4, nameof(source4)); - Error.ThrowArgumentNullException(source5, nameof(source5)); - Error.ThrowArgumentNullException(source6, nameof(source6)); - Error.ThrowArgumentNullException(source7, nameof(source7)); - Error.ThrowArgumentNullException(source8, nameof(source8)); - Error.ThrowArgumentNullException(source9, nameof(source9)); - Error.ThrowArgumentNullException(source10, nameof(source10)); - Error.ThrowArgumentNullException(source11, nameof(source11)); - Error.ThrowArgumentNullException(source12, nameof(source12)); - Error.ThrowArgumentNullException(source13, nameof(source13)); - Error.ThrowArgumentNullException(source14, nameof(source14)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new CombineLatest(source1, source2, source3, source4, source5, source6, source7, source8, source9, source10, source11, source12, source13, source14, resultSelector); - } - - public static IUniTaskAsyncEnumerable CombineLatest(this IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, IUniTaskAsyncEnumerable source10, IUniTaskAsyncEnumerable source11, IUniTaskAsyncEnumerable source12, IUniTaskAsyncEnumerable source13, IUniTaskAsyncEnumerable source14, IUniTaskAsyncEnumerable source15, Func resultSelector) - { - Error.ThrowArgumentNullException(source1, nameof(source1)); - Error.ThrowArgumentNullException(source2, nameof(source2)); - Error.ThrowArgumentNullException(source3, nameof(source3)); - Error.ThrowArgumentNullException(source4, nameof(source4)); - Error.ThrowArgumentNullException(source5, nameof(source5)); - Error.ThrowArgumentNullException(source6, nameof(source6)); - Error.ThrowArgumentNullException(source7, nameof(source7)); - Error.ThrowArgumentNullException(source8, nameof(source8)); - Error.ThrowArgumentNullException(source9, nameof(source9)); - Error.ThrowArgumentNullException(source10, nameof(source10)); - Error.ThrowArgumentNullException(source11, nameof(source11)); - Error.ThrowArgumentNullException(source12, nameof(source12)); - Error.ThrowArgumentNullException(source13, nameof(source13)); - Error.ThrowArgumentNullException(source14, nameof(source14)); - Error.ThrowArgumentNullException(source15, nameof(source15)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new CombineLatest(source1, source2, source3, source4, source5, source6, source7, source8, source9, source10, source11, source12, source13, source14, source15, resultSelector); - } - - } - - internal class CombineLatest : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - - readonly Func resultSelector; - - public CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, Func resultSelector) - { - this.source1 = source1; - this.source2 = source2; - - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _CombineLatest(source1, source2, resultSelector, cancellationToken); - } - - class _CombineLatest : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action Completed1Delegate = Completed1; - static readonly Action Completed2Delegate = Completed2; - const int CompleteCount = 2; - - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - - readonly Func resultSelector; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator1; - UniTask.Awaiter awaiter1; - bool hasCurrent1; - bool running1; - T1 current1; - - IUniTaskAsyncEnumerator enumerator2; - UniTask.Awaiter awaiter2; - bool hasCurrent2; - bool running2; - T2 current2; - - int completedCount; - bool syncRunning; - TResult result; - - public _CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, Func resultSelector, CancellationToken cancellationToken) - { - this.source1 = source1; - this.source2 = source2; - - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current => result; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - if (completedCount == CompleteCount) return CompletedTasks.False; - - if (enumerator1 == null) - { - enumerator1 = source1.GetAsyncEnumerator(cancellationToken); - enumerator2 = source2.GetAsyncEnumerator(cancellationToken); - } - - completionSource.Reset(); - - AGAIN: - syncRunning = true; - if (!running1) - { - running1 = true; - awaiter1 = enumerator1.MoveNextAsync().GetAwaiter(); - if (awaiter1.IsCompleted) - { - Completed1(this); - } - else - { - awaiter1.SourceOnCompleted(Completed1Delegate, this); - } - } - if (!running2) - { - running2 = true; - awaiter2 = enumerator2.MoveNextAsync().GetAwaiter(); - if (awaiter2.IsCompleted) - { - Completed2(this); - } - else - { - awaiter2.SourceOnCompleted(Completed2Delegate, this); - } - } - - if (!running1 || !running2) - { - goto AGAIN; - } - syncRunning = false; - - return new UniTask(this, completionSource.Version); - } - - static void Completed1(object state) - { - var self = (_CombineLatest)state; - self.running1 = false; - - try - { - if (self.awaiter1.GetResult()) - { - self.hasCurrent1 = true; - self.current1 = self.enumerator1.Current; - goto SUCCESS; - } - else - { - self.running1 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running1 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running1 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter1 = self.enumerator1.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter1.SourceOnCompleted(Completed1Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed2(object state) - { - var self = (_CombineLatest)state; - self.running2 = false; - - try - { - if (self.awaiter2.GetResult()) - { - self.hasCurrent2 = true; - self.current2 = self.enumerator2.Current; - goto SUCCESS; - } - else - { - self.running2 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running2 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running2 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter2 = self.enumerator2.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter2.SourceOnCompleted(Completed2Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - bool TrySetResult() - { - if (hasCurrent1 && hasCurrent2) - { - result = resultSelector(current1, current2); - completionSource.TrySetResult(true); - return true; - } - else - { - return false; - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator1 != null) - { - await enumerator1.DisposeAsync(); - } - if (enumerator2 != null) - { - await enumerator2.DisposeAsync(); - } - } - } - } - - internal class CombineLatest : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - - readonly Func resultSelector; - - public CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, Func resultSelector) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _CombineLatest(source1, source2, source3, resultSelector, cancellationToken); - } - - class _CombineLatest : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action Completed1Delegate = Completed1; - static readonly Action Completed2Delegate = Completed2; - static readonly Action Completed3Delegate = Completed3; - const int CompleteCount = 3; - - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - - readonly Func resultSelector; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator1; - UniTask.Awaiter awaiter1; - bool hasCurrent1; - bool running1; - T1 current1; - - IUniTaskAsyncEnumerator enumerator2; - UniTask.Awaiter awaiter2; - bool hasCurrent2; - bool running2; - T2 current2; - - IUniTaskAsyncEnumerator enumerator3; - UniTask.Awaiter awaiter3; - bool hasCurrent3; - bool running3; - T3 current3; - - int completedCount; - bool syncRunning; - TResult result; - - public _CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, Func resultSelector, CancellationToken cancellationToken) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current => result; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - if (completedCount == CompleteCount) return CompletedTasks.False; - - if (enumerator1 == null) - { - enumerator1 = source1.GetAsyncEnumerator(cancellationToken); - enumerator2 = source2.GetAsyncEnumerator(cancellationToken); - enumerator3 = source3.GetAsyncEnumerator(cancellationToken); - } - - completionSource.Reset(); - - AGAIN: - syncRunning = true; - if (!running1) - { - running1 = true; - awaiter1 = enumerator1.MoveNextAsync().GetAwaiter(); - if (awaiter1.IsCompleted) - { - Completed1(this); - } - else - { - awaiter1.SourceOnCompleted(Completed1Delegate, this); - } - } - if (!running2) - { - running2 = true; - awaiter2 = enumerator2.MoveNextAsync().GetAwaiter(); - if (awaiter2.IsCompleted) - { - Completed2(this); - } - else - { - awaiter2.SourceOnCompleted(Completed2Delegate, this); - } - } - if (!running3) - { - running3 = true; - awaiter3 = enumerator3.MoveNextAsync().GetAwaiter(); - if (awaiter3.IsCompleted) - { - Completed3(this); - } - else - { - awaiter3.SourceOnCompleted(Completed3Delegate, this); - } - } - - if (!running1 || !running2 || !running3) - { - goto AGAIN; - } - syncRunning = false; - - return new UniTask(this, completionSource.Version); - } - - static void Completed1(object state) - { - var self = (_CombineLatest)state; - self.running1 = false; - - try - { - if (self.awaiter1.GetResult()) - { - self.hasCurrent1 = true; - self.current1 = self.enumerator1.Current; - goto SUCCESS; - } - else - { - self.running1 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running1 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running1 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter1 = self.enumerator1.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter1.SourceOnCompleted(Completed1Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed2(object state) - { - var self = (_CombineLatest)state; - self.running2 = false; - - try - { - if (self.awaiter2.GetResult()) - { - self.hasCurrent2 = true; - self.current2 = self.enumerator2.Current; - goto SUCCESS; - } - else - { - self.running2 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running2 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running2 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter2 = self.enumerator2.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter2.SourceOnCompleted(Completed2Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed3(object state) - { - var self = (_CombineLatest)state; - self.running3 = false; - - try - { - if (self.awaiter3.GetResult()) - { - self.hasCurrent3 = true; - self.current3 = self.enumerator3.Current; - goto SUCCESS; - } - else - { - self.running3 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running3 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running3 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter3 = self.enumerator3.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter3.SourceOnCompleted(Completed3Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - bool TrySetResult() - { - if (hasCurrent1 && hasCurrent2 && hasCurrent3) - { - result = resultSelector(current1, current2, current3); - completionSource.TrySetResult(true); - return true; - } - else - { - return false; - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator1 != null) - { - await enumerator1.DisposeAsync(); - } - if (enumerator2 != null) - { - await enumerator2.DisposeAsync(); - } - if (enumerator3 != null) - { - await enumerator3.DisposeAsync(); - } - } - } - } - - internal class CombineLatest : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - - readonly Func resultSelector; - - public CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, Func resultSelector) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _CombineLatest(source1, source2, source3, source4, resultSelector, cancellationToken); - } - - class _CombineLatest : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action Completed1Delegate = Completed1; - static readonly Action Completed2Delegate = Completed2; - static readonly Action Completed3Delegate = Completed3; - static readonly Action Completed4Delegate = Completed4; - const int CompleteCount = 4; - - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - - readonly Func resultSelector; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator1; - UniTask.Awaiter awaiter1; - bool hasCurrent1; - bool running1; - T1 current1; - - IUniTaskAsyncEnumerator enumerator2; - UniTask.Awaiter awaiter2; - bool hasCurrent2; - bool running2; - T2 current2; - - IUniTaskAsyncEnumerator enumerator3; - UniTask.Awaiter awaiter3; - bool hasCurrent3; - bool running3; - T3 current3; - - IUniTaskAsyncEnumerator enumerator4; - UniTask.Awaiter awaiter4; - bool hasCurrent4; - bool running4; - T4 current4; - - int completedCount; - bool syncRunning; - TResult result; - - public _CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, Func resultSelector, CancellationToken cancellationToken) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current => result; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - if (completedCount == CompleteCount) return CompletedTasks.False; - - if (enumerator1 == null) - { - enumerator1 = source1.GetAsyncEnumerator(cancellationToken); - enumerator2 = source2.GetAsyncEnumerator(cancellationToken); - enumerator3 = source3.GetAsyncEnumerator(cancellationToken); - enumerator4 = source4.GetAsyncEnumerator(cancellationToken); - } - - completionSource.Reset(); - - AGAIN: - syncRunning = true; - if (!running1) - { - running1 = true; - awaiter1 = enumerator1.MoveNextAsync().GetAwaiter(); - if (awaiter1.IsCompleted) - { - Completed1(this); - } - else - { - awaiter1.SourceOnCompleted(Completed1Delegate, this); - } - } - if (!running2) - { - running2 = true; - awaiter2 = enumerator2.MoveNextAsync().GetAwaiter(); - if (awaiter2.IsCompleted) - { - Completed2(this); - } - else - { - awaiter2.SourceOnCompleted(Completed2Delegate, this); - } - } - if (!running3) - { - running3 = true; - awaiter3 = enumerator3.MoveNextAsync().GetAwaiter(); - if (awaiter3.IsCompleted) - { - Completed3(this); - } - else - { - awaiter3.SourceOnCompleted(Completed3Delegate, this); - } - } - if (!running4) - { - running4 = true; - awaiter4 = enumerator4.MoveNextAsync().GetAwaiter(); - if (awaiter4.IsCompleted) - { - Completed4(this); - } - else - { - awaiter4.SourceOnCompleted(Completed4Delegate, this); - } - } - - if (!running1 || !running2 || !running3 || !running4) - { - goto AGAIN; - } - syncRunning = false; - - return new UniTask(this, completionSource.Version); - } - - static void Completed1(object state) - { - var self = (_CombineLatest)state; - self.running1 = false; - - try - { - if (self.awaiter1.GetResult()) - { - self.hasCurrent1 = true; - self.current1 = self.enumerator1.Current; - goto SUCCESS; - } - else - { - self.running1 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running1 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running1 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter1 = self.enumerator1.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter1.SourceOnCompleted(Completed1Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed2(object state) - { - var self = (_CombineLatest)state; - self.running2 = false; - - try - { - if (self.awaiter2.GetResult()) - { - self.hasCurrent2 = true; - self.current2 = self.enumerator2.Current; - goto SUCCESS; - } - else - { - self.running2 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running2 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running2 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter2 = self.enumerator2.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter2.SourceOnCompleted(Completed2Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed3(object state) - { - var self = (_CombineLatest)state; - self.running3 = false; - - try - { - if (self.awaiter3.GetResult()) - { - self.hasCurrent3 = true; - self.current3 = self.enumerator3.Current; - goto SUCCESS; - } - else - { - self.running3 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running3 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running3 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter3 = self.enumerator3.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter3.SourceOnCompleted(Completed3Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed4(object state) - { - var self = (_CombineLatest)state; - self.running4 = false; - - try - { - if (self.awaiter4.GetResult()) - { - self.hasCurrent4 = true; - self.current4 = self.enumerator4.Current; - goto SUCCESS; - } - else - { - self.running4 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running4 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running4 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter4 = self.enumerator4.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter4.SourceOnCompleted(Completed4Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - bool TrySetResult() - { - if (hasCurrent1 && hasCurrent2 && hasCurrent3 && hasCurrent4) - { - result = resultSelector(current1, current2, current3, current4); - completionSource.TrySetResult(true); - return true; - } - else - { - return false; - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator1 != null) - { - await enumerator1.DisposeAsync(); - } - if (enumerator2 != null) - { - await enumerator2.DisposeAsync(); - } - if (enumerator3 != null) - { - await enumerator3.DisposeAsync(); - } - if (enumerator4 != null) - { - await enumerator4.DisposeAsync(); - } - } - } - } - - internal class CombineLatest : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - - readonly Func resultSelector; - - public CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, Func resultSelector) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _CombineLatest(source1, source2, source3, source4, source5, resultSelector, cancellationToken); - } - - class _CombineLatest : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action Completed1Delegate = Completed1; - static readonly Action Completed2Delegate = Completed2; - static readonly Action Completed3Delegate = Completed3; - static readonly Action Completed4Delegate = Completed4; - static readonly Action Completed5Delegate = Completed5; - const int CompleteCount = 5; - - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - - readonly Func resultSelector; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator1; - UniTask.Awaiter awaiter1; - bool hasCurrent1; - bool running1; - T1 current1; - - IUniTaskAsyncEnumerator enumerator2; - UniTask.Awaiter awaiter2; - bool hasCurrent2; - bool running2; - T2 current2; - - IUniTaskAsyncEnumerator enumerator3; - UniTask.Awaiter awaiter3; - bool hasCurrent3; - bool running3; - T3 current3; - - IUniTaskAsyncEnumerator enumerator4; - UniTask.Awaiter awaiter4; - bool hasCurrent4; - bool running4; - T4 current4; - - IUniTaskAsyncEnumerator enumerator5; - UniTask.Awaiter awaiter5; - bool hasCurrent5; - bool running5; - T5 current5; - - int completedCount; - bool syncRunning; - TResult result; - - public _CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, Func resultSelector, CancellationToken cancellationToken) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current => result; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - if (completedCount == CompleteCount) return CompletedTasks.False; - - if (enumerator1 == null) - { - enumerator1 = source1.GetAsyncEnumerator(cancellationToken); - enumerator2 = source2.GetAsyncEnumerator(cancellationToken); - enumerator3 = source3.GetAsyncEnumerator(cancellationToken); - enumerator4 = source4.GetAsyncEnumerator(cancellationToken); - enumerator5 = source5.GetAsyncEnumerator(cancellationToken); - } - - completionSource.Reset(); - - AGAIN: - syncRunning = true; - if (!running1) - { - running1 = true; - awaiter1 = enumerator1.MoveNextAsync().GetAwaiter(); - if (awaiter1.IsCompleted) - { - Completed1(this); - } - else - { - awaiter1.SourceOnCompleted(Completed1Delegate, this); - } - } - if (!running2) - { - running2 = true; - awaiter2 = enumerator2.MoveNextAsync().GetAwaiter(); - if (awaiter2.IsCompleted) - { - Completed2(this); - } - else - { - awaiter2.SourceOnCompleted(Completed2Delegate, this); - } - } - if (!running3) - { - running3 = true; - awaiter3 = enumerator3.MoveNextAsync().GetAwaiter(); - if (awaiter3.IsCompleted) - { - Completed3(this); - } - else - { - awaiter3.SourceOnCompleted(Completed3Delegate, this); - } - } - if (!running4) - { - running4 = true; - awaiter4 = enumerator4.MoveNextAsync().GetAwaiter(); - if (awaiter4.IsCompleted) - { - Completed4(this); - } - else - { - awaiter4.SourceOnCompleted(Completed4Delegate, this); - } - } - if (!running5) - { - running5 = true; - awaiter5 = enumerator5.MoveNextAsync().GetAwaiter(); - if (awaiter5.IsCompleted) - { - Completed5(this); - } - else - { - awaiter5.SourceOnCompleted(Completed5Delegate, this); - } - } - - if (!running1 || !running2 || !running3 || !running4 || !running5) - { - goto AGAIN; - } - syncRunning = false; - - return new UniTask(this, completionSource.Version); - } - - static void Completed1(object state) - { - var self = (_CombineLatest)state; - self.running1 = false; - - try - { - if (self.awaiter1.GetResult()) - { - self.hasCurrent1 = true; - self.current1 = self.enumerator1.Current; - goto SUCCESS; - } - else - { - self.running1 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running1 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running1 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter1 = self.enumerator1.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter1.SourceOnCompleted(Completed1Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed2(object state) - { - var self = (_CombineLatest)state; - self.running2 = false; - - try - { - if (self.awaiter2.GetResult()) - { - self.hasCurrent2 = true; - self.current2 = self.enumerator2.Current; - goto SUCCESS; - } - else - { - self.running2 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running2 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running2 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter2 = self.enumerator2.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter2.SourceOnCompleted(Completed2Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed3(object state) - { - var self = (_CombineLatest)state; - self.running3 = false; - - try - { - if (self.awaiter3.GetResult()) - { - self.hasCurrent3 = true; - self.current3 = self.enumerator3.Current; - goto SUCCESS; - } - else - { - self.running3 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running3 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running3 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter3 = self.enumerator3.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter3.SourceOnCompleted(Completed3Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed4(object state) - { - var self = (_CombineLatest)state; - self.running4 = false; - - try - { - if (self.awaiter4.GetResult()) - { - self.hasCurrent4 = true; - self.current4 = self.enumerator4.Current; - goto SUCCESS; - } - else - { - self.running4 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running4 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running4 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter4 = self.enumerator4.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter4.SourceOnCompleted(Completed4Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed5(object state) - { - var self = (_CombineLatest)state; - self.running5 = false; - - try - { - if (self.awaiter5.GetResult()) - { - self.hasCurrent5 = true; - self.current5 = self.enumerator5.Current; - goto SUCCESS; - } - else - { - self.running5 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running5 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running5 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter5 = self.enumerator5.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter5.SourceOnCompleted(Completed5Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - bool TrySetResult() - { - if (hasCurrent1 && hasCurrent2 && hasCurrent3 && hasCurrent4 && hasCurrent5) - { - result = resultSelector(current1, current2, current3, current4, current5); - completionSource.TrySetResult(true); - return true; - } - else - { - return false; - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator1 != null) - { - await enumerator1.DisposeAsync(); - } - if (enumerator2 != null) - { - await enumerator2.DisposeAsync(); - } - if (enumerator3 != null) - { - await enumerator3.DisposeAsync(); - } - if (enumerator4 != null) - { - await enumerator4.DisposeAsync(); - } - if (enumerator5 != null) - { - await enumerator5.DisposeAsync(); - } - } - } - } - - internal class CombineLatest : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - - readonly Func resultSelector; - - public CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, Func resultSelector) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _CombineLatest(source1, source2, source3, source4, source5, source6, resultSelector, cancellationToken); - } - - class _CombineLatest : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action Completed1Delegate = Completed1; - static readonly Action Completed2Delegate = Completed2; - static readonly Action Completed3Delegate = Completed3; - static readonly Action Completed4Delegate = Completed4; - static readonly Action Completed5Delegate = Completed5; - static readonly Action Completed6Delegate = Completed6; - const int CompleteCount = 6; - - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - - readonly Func resultSelector; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator1; - UniTask.Awaiter awaiter1; - bool hasCurrent1; - bool running1; - T1 current1; - - IUniTaskAsyncEnumerator enumerator2; - UniTask.Awaiter awaiter2; - bool hasCurrent2; - bool running2; - T2 current2; - - IUniTaskAsyncEnumerator enumerator3; - UniTask.Awaiter awaiter3; - bool hasCurrent3; - bool running3; - T3 current3; - - IUniTaskAsyncEnumerator enumerator4; - UniTask.Awaiter awaiter4; - bool hasCurrent4; - bool running4; - T4 current4; - - IUniTaskAsyncEnumerator enumerator5; - UniTask.Awaiter awaiter5; - bool hasCurrent5; - bool running5; - T5 current5; - - IUniTaskAsyncEnumerator enumerator6; - UniTask.Awaiter awaiter6; - bool hasCurrent6; - bool running6; - T6 current6; - - int completedCount; - bool syncRunning; - TResult result; - - public _CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, Func resultSelector, CancellationToken cancellationToken) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current => result; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - if (completedCount == CompleteCount) return CompletedTasks.False; - - if (enumerator1 == null) - { - enumerator1 = source1.GetAsyncEnumerator(cancellationToken); - enumerator2 = source2.GetAsyncEnumerator(cancellationToken); - enumerator3 = source3.GetAsyncEnumerator(cancellationToken); - enumerator4 = source4.GetAsyncEnumerator(cancellationToken); - enumerator5 = source5.GetAsyncEnumerator(cancellationToken); - enumerator6 = source6.GetAsyncEnumerator(cancellationToken); - } - - completionSource.Reset(); - - AGAIN: - syncRunning = true; - if (!running1) - { - running1 = true; - awaiter1 = enumerator1.MoveNextAsync().GetAwaiter(); - if (awaiter1.IsCompleted) - { - Completed1(this); - } - else - { - awaiter1.SourceOnCompleted(Completed1Delegate, this); - } - } - if (!running2) - { - running2 = true; - awaiter2 = enumerator2.MoveNextAsync().GetAwaiter(); - if (awaiter2.IsCompleted) - { - Completed2(this); - } - else - { - awaiter2.SourceOnCompleted(Completed2Delegate, this); - } - } - if (!running3) - { - running3 = true; - awaiter3 = enumerator3.MoveNextAsync().GetAwaiter(); - if (awaiter3.IsCompleted) - { - Completed3(this); - } - else - { - awaiter3.SourceOnCompleted(Completed3Delegate, this); - } - } - if (!running4) - { - running4 = true; - awaiter4 = enumerator4.MoveNextAsync().GetAwaiter(); - if (awaiter4.IsCompleted) - { - Completed4(this); - } - else - { - awaiter4.SourceOnCompleted(Completed4Delegate, this); - } - } - if (!running5) - { - running5 = true; - awaiter5 = enumerator5.MoveNextAsync().GetAwaiter(); - if (awaiter5.IsCompleted) - { - Completed5(this); - } - else - { - awaiter5.SourceOnCompleted(Completed5Delegate, this); - } - } - if (!running6) - { - running6 = true; - awaiter6 = enumerator6.MoveNextAsync().GetAwaiter(); - if (awaiter6.IsCompleted) - { - Completed6(this); - } - else - { - awaiter6.SourceOnCompleted(Completed6Delegate, this); - } - } - - if (!running1 || !running2 || !running3 || !running4 || !running5 || !running6) - { - goto AGAIN; - } - syncRunning = false; - - return new UniTask(this, completionSource.Version); - } - - static void Completed1(object state) - { - var self = (_CombineLatest)state; - self.running1 = false; - - try - { - if (self.awaiter1.GetResult()) - { - self.hasCurrent1 = true; - self.current1 = self.enumerator1.Current; - goto SUCCESS; - } - else - { - self.running1 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running1 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running1 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter1 = self.enumerator1.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter1.SourceOnCompleted(Completed1Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed2(object state) - { - var self = (_CombineLatest)state; - self.running2 = false; - - try - { - if (self.awaiter2.GetResult()) - { - self.hasCurrent2 = true; - self.current2 = self.enumerator2.Current; - goto SUCCESS; - } - else - { - self.running2 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running2 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running2 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter2 = self.enumerator2.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter2.SourceOnCompleted(Completed2Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed3(object state) - { - var self = (_CombineLatest)state; - self.running3 = false; - - try - { - if (self.awaiter3.GetResult()) - { - self.hasCurrent3 = true; - self.current3 = self.enumerator3.Current; - goto SUCCESS; - } - else - { - self.running3 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running3 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running3 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter3 = self.enumerator3.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter3.SourceOnCompleted(Completed3Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed4(object state) - { - var self = (_CombineLatest)state; - self.running4 = false; - - try - { - if (self.awaiter4.GetResult()) - { - self.hasCurrent4 = true; - self.current4 = self.enumerator4.Current; - goto SUCCESS; - } - else - { - self.running4 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running4 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running4 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter4 = self.enumerator4.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter4.SourceOnCompleted(Completed4Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed5(object state) - { - var self = (_CombineLatest)state; - self.running5 = false; - - try - { - if (self.awaiter5.GetResult()) - { - self.hasCurrent5 = true; - self.current5 = self.enumerator5.Current; - goto SUCCESS; - } - else - { - self.running5 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running5 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running5 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter5 = self.enumerator5.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter5.SourceOnCompleted(Completed5Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed6(object state) - { - var self = (_CombineLatest)state; - self.running6 = false; - - try - { - if (self.awaiter6.GetResult()) - { - self.hasCurrent6 = true; - self.current6 = self.enumerator6.Current; - goto SUCCESS; - } - else - { - self.running6 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running6 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running6 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter6 = self.enumerator6.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter6.SourceOnCompleted(Completed6Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - bool TrySetResult() - { - if (hasCurrent1 && hasCurrent2 && hasCurrent3 && hasCurrent4 && hasCurrent5 && hasCurrent6) - { - result = resultSelector(current1, current2, current3, current4, current5, current6); - completionSource.TrySetResult(true); - return true; - } - else - { - return false; - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator1 != null) - { - await enumerator1.DisposeAsync(); - } - if (enumerator2 != null) - { - await enumerator2.DisposeAsync(); - } - if (enumerator3 != null) - { - await enumerator3.DisposeAsync(); - } - if (enumerator4 != null) - { - await enumerator4.DisposeAsync(); - } - if (enumerator5 != null) - { - await enumerator5.DisposeAsync(); - } - if (enumerator6 != null) - { - await enumerator6.DisposeAsync(); - } - } - } - } - - internal class CombineLatest : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - readonly IUniTaskAsyncEnumerable source7; - - readonly Func resultSelector; - - public CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, Func resultSelector) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - this.source7 = source7; - - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _CombineLatest(source1, source2, source3, source4, source5, source6, source7, resultSelector, cancellationToken); - } - - class _CombineLatest : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action Completed1Delegate = Completed1; - static readonly Action Completed2Delegate = Completed2; - static readonly Action Completed3Delegate = Completed3; - static readonly Action Completed4Delegate = Completed4; - static readonly Action Completed5Delegate = Completed5; - static readonly Action Completed6Delegate = Completed6; - static readonly Action Completed7Delegate = Completed7; - const int CompleteCount = 7; - - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - readonly IUniTaskAsyncEnumerable source7; - - readonly Func resultSelector; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator1; - UniTask.Awaiter awaiter1; - bool hasCurrent1; - bool running1; - T1 current1; - - IUniTaskAsyncEnumerator enumerator2; - UniTask.Awaiter awaiter2; - bool hasCurrent2; - bool running2; - T2 current2; - - IUniTaskAsyncEnumerator enumerator3; - UniTask.Awaiter awaiter3; - bool hasCurrent3; - bool running3; - T3 current3; - - IUniTaskAsyncEnumerator enumerator4; - UniTask.Awaiter awaiter4; - bool hasCurrent4; - bool running4; - T4 current4; - - IUniTaskAsyncEnumerator enumerator5; - UniTask.Awaiter awaiter5; - bool hasCurrent5; - bool running5; - T5 current5; - - IUniTaskAsyncEnumerator enumerator6; - UniTask.Awaiter awaiter6; - bool hasCurrent6; - bool running6; - T6 current6; - - IUniTaskAsyncEnumerator enumerator7; - UniTask.Awaiter awaiter7; - bool hasCurrent7; - bool running7; - T7 current7; - - int completedCount; - bool syncRunning; - TResult result; - - public _CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, Func resultSelector, CancellationToken cancellationToken) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - this.source7 = source7; - - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current => result; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - if (completedCount == CompleteCount) return CompletedTasks.False; - - if (enumerator1 == null) - { - enumerator1 = source1.GetAsyncEnumerator(cancellationToken); - enumerator2 = source2.GetAsyncEnumerator(cancellationToken); - enumerator3 = source3.GetAsyncEnumerator(cancellationToken); - enumerator4 = source4.GetAsyncEnumerator(cancellationToken); - enumerator5 = source5.GetAsyncEnumerator(cancellationToken); - enumerator6 = source6.GetAsyncEnumerator(cancellationToken); - enumerator7 = source7.GetAsyncEnumerator(cancellationToken); - } - - completionSource.Reset(); - - AGAIN: - syncRunning = true; - if (!running1) - { - running1 = true; - awaiter1 = enumerator1.MoveNextAsync().GetAwaiter(); - if (awaiter1.IsCompleted) - { - Completed1(this); - } - else - { - awaiter1.SourceOnCompleted(Completed1Delegate, this); - } - } - if (!running2) - { - running2 = true; - awaiter2 = enumerator2.MoveNextAsync().GetAwaiter(); - if (awaiter2.IsCompleted) - { - Completed2(this); - } - else - { - awaiter2.SourceOnCompleted(Completed2Delegate, this); - } - } - if (!running3) - { - running3 = true; - awaiter3 = enumerator3.MoveNextAsync().GetAwaiter(); - if (awaiter3.IsCompleted) - { - Completed3(this); - } - else - { - awaiter3.SourceOnCompleted(Completed3Delegate, this); - } - } - if (!running4) - { - running4 = true; - awaiter4 = enumerator4.MoveNextAsync().GetAwaiter(); - if (awaiter4.IsCompleted) - { - Completed4(this); - } - else - { - awaiter4.SourceOnCompleted(Completed4Delegate, this); - } - } - if (!running5) - { - running5 = true; - awaiter5 = enumerator5.MoveNextAsync().GetAwaiter(); - if (awaiter5.IsCompleted) - { - Completed5(this); - } - else - { - awaiter5.SourceOnCompleted(Completed5Delegate, this); - } - } - if (!running6) - { - running6 = true; - awaiter6 = enumerator6.MoveNextAsync().GetAwaiter(); - if (awaiter6.IsCompleted) - { - Completed6(this); - } - else - { - awaiter6.SourceOnCompleted(Completed6Delegate, this); - } - } - if (!running7) - { - running7 = true; - awaiter7 = enumerator7.MoveNextAsync().GetAwaiter(); - if (awaiter7.IsCompleted) - { - Completed7(this); - } - else - { - awaiter7.SourceOnCompleted(Completed7Delegate, this); - } - } - - if (!running1 || !running2 || !running3 || !running4 || !running5 || !running6 || !running7) - { - goto AGAIN; - } - syncRunning = false; - - return new UniTask(this, completionSource.Version); - } - - static void Completed1(object state) - { - var self = (_CombineLatest)state; - self.running1 = false; - - try - { - if (self.awaiter1.GetResult()) - { - self.hasCurrent1 = true; - self.current1 = self.enumerator1.Current; - goto SUCCESS; - } - else - { - self.running1 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running1 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running1 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter1 = self.enumerator1.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter1.SourceOnCompleted(Completed1Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed2(object state) - { - var self = (_CombineLatest)state; - self.running2 = false; - - try - { - if (self.awaiter2.GetResult()) - { - self.hasCurrent2 = true; - self.current2 = self.enumerator2.Current; - goto SUCCESS; - } - else - { - self.running2 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running2 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running2 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter2 = self.enumerator2.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter2.SourceOnCompleted(Completed2Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed3(object state) - { - var self = (_CombineLatest)state; - self.running3 = false; - - try - { - if (self.awaiter3.GetResult()) - { - self.hasCurrent3 = true; - self.current3 = self.enumerator3.Current; - goto SUCCESS; - } - else - { - self.running3 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running3 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running3 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter3 = self.enumerator3.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter3.SourceOnCompleted(Completed3Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed4(object state) - { - var self = (_CombineLatest)state; - self.running4 = false; - - try - { - if (self.awaiter4.GetResult()) - { - self.hasCurrent4 = true; - self.current4 = self.enumerator4.Current; - goto SUCCESS; - } - else - { - self.running4 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running4 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running4 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter4 = self.enumerator4.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter4.SourceOnCompleted(Completed4Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed5(object state) - { - var self = (_CombineLatest)state; - self.running5 = false; - - try - { - if (self.awaiter5.GetResult()) - { - self.hasCurrent5 = true; - self.current5 = self.enumerator5.Current; - goto SUCCESS; - } - else - { - self.running5 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running5 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running5 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter5 = self.enumerator5.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter5.SourceOnCompleted(Completed5Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed6(object state) - { - var self = (_CombineLatest)state; - self.running6 = false; - - try - { - if (self.awaiter6.GetResult()) - { - self.hasCurrent6 = true; - self.current6 = self.enumerator6.Current; - goto SUCCESS; - } - else - { - self.running6 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running6 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running6 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter6 = self.enumerator6.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter6.SourceOnCompleted(Completed6Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed7(object state) - { - var self = (_CombineLatest)state; - self.running7 = false; - - try - { - if (self.awaiter7.GetResult()) - { - self.hasCurrent7 = true; - self.current7 = self.enumerator7.Current; - goto SUCCESS; - } - else - { - self.running7 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running7 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running7 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter7 = self.enumerator7.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter7.SourceOnCompleted(Completed7Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - bool TrySetResult() - { - if (hasCurrent1 && hasCurrent2 && hasCurrent3 && hasCurrent4 && hasCurrent5 && hasCurrent6 && hasCurrent7) - { - result = resultSelector(current1, current2, current3, current4, current5, current6, current7); - completionSource.TrySetResult(true); - return true; - } - else - { - return false; - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator1 != null) - { - await enumerator1.DisposeAsync(); - } - if (enumerator2 != null) - { - await enumerator2.DisposeAsync(); - } - if (enumerator3 != null) - { - await enumerator3.DisposeAsync(); - } - if (enumerator4 != null) - { - await enumerator4.DisposeAsync(); - } - if (enumerator5 != null) - { - await enumerator5.DisposeAsync(); - } - if (enumerator6 != null) - { - await enumerator6.DisposeAsync(); - } - if (enumerator7 != null) - { - await enumerator7.DisposeAsync(); - } - } - } - } - - internal class CombineLatest : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - readonly IUniTaskAsyncEnumerable source7; - readonly IUniTaskAsyncEnumerable source8; - - readonly Func resultSelector; - - public CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, Func resultSelector) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - this.source7 = source7; - this.source8 = source8; - - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _CombineLatest(source1, source2, source3, source4, source5, source6, source7, source8, resultSelector, cancellationToken); - } - - class _CombineLatest : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action Completed1Delegate = Completed1; - static readonly Action Completed2Delegate = Completed2; - static readonly Action Completed3Delegate = Completed3; - static readonly Action Completed4Delegate = Completed4; - static readonly Action Completed5Delegate = Completed5; - static readonly Action Completed6Delegate = Completed6; - static readonly Action Completed7Delegate = Completed7; - static readonly Action Completed8Delegate = Completed8; - const int CompleteCount = 8; - - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - readonly IUniTaskAsyncEnumerable source7; - readonly IUniTaskAsyncEnumerable source8; - - readonly Func resultSelector; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator1; - UniTask.Awaiter awaiter1; - bool hasCurrent1; - bool running1; - T1 current1; - - IUniTaskAsyncEnumerator enumerator2; - UniTask.Awaiter awaiter2; - bool hasCurrent2; - bool running2; - T2 current2; - - IUniTaskAsyncEnumerator enumerator3; - UniTask.Awaiter awaiter3; - bool hasCurrent3; - bool running3; - T3 current3; - - IUniTaskAsyncEnumerator enumerator4; - UniTask.Awaiter awaiter4; - bool hasCurrent4; - bool running4; - T4 current4; - - IUniTaskAsyncEnumerator enumerator5; - UniTask.Awaiter awaiter5; - bool hasCurrent5; - bool running5; - T5 current5; - - IUniTaskAsyncEnumerator enumerator6; - UniTask.Awaiter awaiter6; - bool hasCurrent6; - bool running6; - T6 current6; - - IUniTaskAsyncEnumerator enumerator7; - UniTask.Awaiter awaiter7; - bool hasCurrent7; - bool running7; - T7 current7; - - IUniTaskAsyncEnumerator enumerator8; - UniTask.Awaiter awaiter8; - bool hasCurrent8; - bool running8; - T8 current8; - - int completedCount; - bool syncRunning; - TResult result; - - public _CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, Func resultSelector, CancellationToken cancellationToken) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - this.source7 = source7; - this.source8 = source8; - - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current => result; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - if (completedCount == CompleteCount) return CompletedTasks.False; - - if (enumerator1 == null) - { - enumerator1 = source1.GetAsyncEnumerator(cancellationToken); - enumerator2 = source2.GetAsyncEnumerator(cancellationToken); - enumerator3 = source3.GetAsyncEnumerator(cancellationToken); - enumerator4 = source4.GetAsyncEnumerator(cancellationToken); - enumerator5 = source5.GetAsyncEnumerator(cancellationToken); - enumerator6 = source6.GetAsyncEnumerator(cancellationToken); - enumerator7 = source7.GetAsyncEnumerator(cancellationToken); - enumerator8 = source8.GetAsyncEnumerator(cancellationToken); - } - - completionSource.Reset(); - - AGAIN: - syncRunning = true; - if (!running1) - { - running1 = true; - awaiter1 = enumerator1.MoveNextAsync().GetAwaiter(); - if (awaiter1.IsCompleted) - { - Completed1(this); - } - else - { - awaiter1.SourceOnCompleted(Completed1Delegate, this); - } - } - if (!running2) - { - running2 = true; - awaiter2 = enumerator2.MoveNextAsync().GetAwaiter(); - if (awaiter2.IsCompleted) - { - Completed2(this); - } - else - { - awaiter2.SourceOnCompleted(Completed2Delegate, this); - } - } - if (!running3) - { - running3 = true; - awaiter3 = enumerator3.MoveNextAsync().GetAwaiter(); - if (awaiter3.IsCompleted) - { - Completed3(this); - } - else - { - awaiter3.SourceOnCompleted(Completed3Delegate, this); - } - } - if (!running4) - { - running4 = true; - awaiter4 = enumerator4.MoveNextAsync().GetAwaiter(); - if (awaiter4.IsCompleted) - { - Completed4(this); - } - else - { - awaiter4.SourceOnCompleted(Completed4Delegate, this); - } - } - if (!running5) - { - running5 = true; - awaiter5 = enumerator5.MoveNextAsync().GetAwaiter(); - if (awaiter5.IsCompleted) - { - Completed5(this); - } - else - { - awaiter5.SourceOnCompleted(Completed5Delegate, this); - } - } - if (!running6) - { - running6 = true; - awaiter6 = enumerator6.MoveNextAsync().GetAwaiter(); - if (awaiter6.IsCompleted) - { - Completed6(this); - } - else - { - awaiter6.SourceOnCompleted(Completed6Delegate, this); - } - } - if (!running7) - { - running7 = true; - awaiter7 = enumerator7.MoveNextAsync().GetAwaiter(); - if (awaiter7.IsCompleted) - { - Completed7(this); - } - else - { - awaiter7.SourceOnCompleted(Completed7Delegate, this); - } - } - if (!running8) - { - running8 = true; - awaiter8 = enumerator8.MoveNextAsync().GetAwaiter(); - if (awaiter8.IsCompleted) - { - Completed8(this); - } - else - { - awaiter8.SourceOnCompleted(Completed8Delegate, this); - } - } - - if (!running1 || !running2 || !running3 || !running4 || !running5 || !running6 || !running7 || !running8) - { - goto AGAIN; - } - syncRunning = false; - - return new UniTask(this, completionSource.Version); - } - - static void Completed1(object state) - { - var self = (_CombineLatest)state; - self.running1 = false; - - try - { - if (self.awaiter1.GetResult()) - { - self.hasCurrent1 = true; - self.current1 = self.enumerator1.Current; - goto SUCCESS; - } - else - { - self.running1 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running1 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running1 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter1 = self.enumerator1.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter1.SourceOnCompleted(Completed1Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed2(object state) - { - var self = (_CombineLatest)state; - self.running2 = false; - - try - { - if (self.awaiter2.GetResult()) - { - self.hasCurrent2 = true; - self.current2 = self.enumerator2.Current; - goto SUCCESS; - } - else - { - self.running2 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running2 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running2 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter2 = self.enumerator2.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter2.SourceOnCompleted(Completed2Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed3(object state) - { - var self = (_CombineLatest)state; - self.running3 = false; - - try - { - if (self.awaiter3.GetResult()) - { - self.hasCurrent3 = true; - self.current3 = self.enumerator3.Current; - goto SUCCESS; - } - else - { - self.running3 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running3 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running3 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter3 = self.enumerator3.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter3.SourceOnCompleted(Completed3Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed4(object state) - { - var self = (_CombineLatest)state; - self.running4 = false; - - try - { - if (self.awaiter4.GetResult()) - { - self.hasCurrent4 = true; - self.current4 = self.enumerator4.Current; - goto SUCCESS; - } - else - { - self.running4 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running4 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running4 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter4 = self.enumerator4.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter4.SourceOnCompleted(Completed4Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed5(object state) - { - var self = (_CombineLatest)state; - self.running5 = false; - - try - { - if (self.awaiter5.GetResult()) - { - self.hasCurrent5 = true; - self.current5 = self.enumerator5.Current; - goto SUCCESS; - } - else - { - self.running5 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running5 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running5 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter5 = self.enumerator5.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter5.SourceOnCompleted(Completed5Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed6(object state) - { - var self = (_CombineLatest)state; - self.running6 = false; - - try - { - if (self.awaiter6.GetResult()) - { - self.hasCurrent6 = true; - self.current6 = self.enumerator6.Current; - goto SUCCESS; - } - else - { - self.running6 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running6 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running6 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter6 = self.enumerator6.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter6.SourceOnCompleted(Completed6Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed7(object state) - { - var self = (_CombineLatest)state; - self.running7 = false; - - try - { - if (self.awaiter7.GetResult()) - { - self.hasCurrent7 = true; - self.current7 = self.enumerator7.Current; - goto SUCCESS; - } - else - { - self.running7 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running7 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running7 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter7 = self.enumerator7.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter7.SourceOnCompleted(Completed7Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed8(object state) - { - var self = (_CombineLatest)state; - self.running8 = false; - - try - { - if (self.awaiter8.GetResult()) - { - self.hasCurrent8 = true; - self.current8 = self.enumerator8.Current; - goto SUCCESS; - } - else - { - self.running8 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running8 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running8 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter8 = self.enumerator8.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter8.SourceOnCompleted(Completed8Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - bool TrySetResult() - { - if (hasCurrent1 && hasCurrent2 && hasCurrent3 && hasCurrent4 && hasCurrent5 && hasCurrent6 && hasCurrent7 && hasCurrent8) - { - result = resultSelector(current1, current2, current3, current4, current5, current6, current7, current8); - completionSource.TrySetResult(true); - return true; - } - else - { - return false; - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator1 != null) - { - await enumerator1.DisposeAsync(); - } - if (enumerator2 != null) - { - await enumerator2.DisposeAsync(); - } - if (enumerator3 != null) - { - await enumerator3.DisposeAsync(); - } - if (enumerator4 != null) - { - await enumerator4.DisposeAsync(); - } - if (enumerator5 != null) - { - await enumerator5.DisposeAsync(); - } - if (enumerator6 != null) - { - await enumerator6.DisposeAsync(); - } - if (enumerator7 != null) - { - await enumerator7.DisposeAsync(); - } - if (enumerator8 != null) - { - await enumerator8.DisposeAsync(); - } - } - } - } - - internal class CombineLatest : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - readonly IUniTaskAsyncEnumerable source7; - readonly IUniTaskAsyncEnumerable source8; - readonly IUniTaskAsyncEnumerable source9; - - readonly Func resultSelector; - - public CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, Func resultSelector) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - this.source7 = source7; - this.source8 = source8; - this.source9 = source9; - - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _CombineLatest(source1, source2, source3, source4, source5, source6, source7, source8, source9, resultSelector, cancellationToken); - } - - class _CombineLatest : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action Completed1Delegate = Completed1; - static readonly Action Completed2Delegate = Completed2; - static readonly Action Completed3Delegate = Completed3; - static readonly Action Completed4Delegate = Completed4; - static readonly Action Completed5Delegate = Completed5; - static readonly Action Completed6Delegate = Completed6; - static readonly Action Completed7Delegate = Completed7; - static readonly Action Completed8Delegate = Completed8; - static readonly Action Completed9Delegate = Completed9; - const int CompleteCount = 9; - - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - readonly IUniTaskAsyncEnumerable source7; - readonly IUniTaskAsyncEnumerable source8; - readonly IUniTaskAsyncEnumerable source9; - - readonly Func resultSelector; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator1; - UniTask.Awaiter awaiter1; - bool hasCurrent1; - bool running1; - T1 current1; - - IUniTaskAsyncEnumerator enumerator2; - UniTask.Awaiter awaiter2; - bool hasCurrent2; - bool running2; - T2 current2; - - IUniTaskAsyncEnumerator enumerator3; - UniTask.Awaiter awaiter3; - bool hasCurrent3; - bool running3; - T3 current3; - - IUniTaskAsyncEnumerator enumerator4; - UniTask.Awaiter awaiter4; - bool hasCurrent4; - bool running4; - T4 current4; - - IUniTaskAsyncEnumerator enumerator5; - UniTask.Awaiter awaiter5; - bool hasCurrent5; - bool running5; - T5 current5; - - IUniTaskAsyncEnumerator enumerator6; - UniTask.Awaiter awaiter6; - bool hasCurrent6; - bool running6; - T6 current6; - - IUniTaskAsyncEnumerator enumerator7; - UniTask.Awaiter awaiter7; - bool hasCurrent7; - bool running7; - T7 current7; - - IUniTaskAsyncEnumerator enumerator8; - UniTask.Awaiter awaiter8; - bool hasCurrent8; - bool running8; - T8 current8; - - IUniTaskAsyncEnumerator enumerator9; - UniTask.Awaiter awaiter9; - bool hasCurrent9; - bool running9; - T9 current9; - - int completedCount; - bool syncRunning; - TResult result; - - public _CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, Func resultSelector, CancellationToken cancellationToken) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - this.source7 = source7; - this.source8 = source8; - this.source9 = source9; - - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current => result; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - if (completedCount == CompleteCount) return CompletedTasks.False; - - if (enumerator1 == null) - { - enumerator1 = source1.GetAsyncEnumerator(cancellationToken); - enumerator2 = source2.GetAsyncEnumerator(cancellationToken); - enumerator3 = source3.GetAsyncEnumerator(cancellationToken); - enumerator4 = source4.GetAsyncEnumerator(cancellationToken); - enumerator5 = source5.GetAsyncEnumerator(cancellationToken); - enumerator6 = source6.GetAsyncEnumerator(cancellationToken); - enumerator7 = source7.GetAsyncEnumerator(cancellationToken); - enumerator8 = source8.GetAsyncEnumerator(cancellationToken); - enumerator9 = source9.GetAsyncEnumerator(cancellationToken); - } - - completionSource.Reset(); - - AGAIN: - syncRunning = true; - if (!running1) - { - running1 = true; - awaiter1 = enumerator1.MoveNextAsync().GetAwaiter(); - if (awaiter1.IsCompleted) - { - Completed1(this); - } - else - { - awaiter1.SourceOnCompleted(Completed1Delegate, this); - } - } - if (!running2) - { - running2 = true; - awaiter2 = enumerator2.MoveNextAsync().GetAwaiter(); - if (awaiter2.IsCompleted) - { - Completed2(this); - } - else - { - awaiter2.SourceOnCompleted(Completed2Delegate, this); - } - } - if (!running3) - { - running3 = true; - awaiter3 = enumerator3.MoveNextAsync().GetAwaiter(); - if (awaiter3.IsCompleted) - { - Completed3(this); - } - else - { - awaiter3.SourceOnCompleted(Completed3Delegate, this); - } - } - if (!running4) - { - running4 = true; - awaiter4 = enumerator4.MoveNextAsync().GetAwaiter(); - if (awaiter4.IsCompleted) - { - Completed4(this); - } - else - { - awaiter4.SourceOnCompleted(Completed4Delegate, this); - } - } - if (!running5) - { - running5 = true; - awaiter5 = enumerator5.MoveNextAsync().GetAwaiter(); - if (awaiter5.IsCompleted) - { - Completed5(this); - } - else - { - awaiter5.SourceOnCompleted(Completed5Delegate, this); - } - } - if (!running6) - { - running6 = true; - awaiter6 = enumerator6.MoveNextAsync().GetAwaiter(); - if (awaiter6.IsCompleted) - { - Completed6(this); - } - else - { - awaiter6.SourceOnCompleted(Completed6Delegate, this); - } - } - if (!running7) - { - running7 = true; - awaiter7 = enumerator7.MoveNextAsync().GetAwaiter(); - if (awaiter7.IsCompleted) - { - Completed7(this); - } - else - { - awaiter7.SourceOnCompleted(Completed7Delegate, this); - } - } - if (!running8) - { - running8 = true; - awaiter8 = enumerator8.MoveNextAsync().GetAwaiter(); - if (awaiter8.IsCompleted) - { - Completed8(this); - } - else - { - awaiter8.SourceOnCompleted(Completed8Delegate, this); - } - } - if (!running9) - { - running9 = true; - awaiter9 = enumerator9.MoveNextAsync().GetAwaiter(); - if (awaiter9.IsCompleted) - { - Completed9(this); - } - else - { - awaiter9.SourceOnCompleted(Completed9Delegate, this); - } - } - - if (!running1 || !running2 || !running3 || !running4 || !running5 || !running6 || !running7 || !running8 || !running9) - { - goto AGAIN; - } - syncRunning = false; - - return new UniTask(this, completionSource.Version); - } - - static void Completed1(object state) - { - var self = (_CombineLatest)state; - self.running1 = false; - - try - { - if (self.awaiter1.GetResult()) - { - self.hasCurrent1 = true; - self.current1 = self.enumerator1.Current; - goto SUCCESS; - } - else - { - self.running1 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running1 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running1 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter1 = self.enumerator1.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter1.SourceOnCompleted(Completed1Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed2(object state) - { - var self = (_CombineLatest)state; - self.running2 = false; - - try - { - if (self.awaiter2.GetResult()) - { - self.hasCurrent2 = true; - self.current2 = self.enumerator2.Current; - goto SUCCESS; - } - else - { - self.running2 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running2 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running2 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter2 = self.enumerator2.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter2.SourceOnCompleted(Completed2Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed3(object state) - { - var self = (_CombineLatest)state; - self.running3 = false; - - try - { - if (self.awaiter3.GetResult()) - { - self.hasCurrent3 = true; - self.current3 = self.enumerator3.Current; - goto SUCCESS; - } - else - { - self.running3 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running3 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running3 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter3 = self.enumerator3.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter3.SourceOnCompleted(Completed3Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed4(object state) - { - var self = (_CombineLatest)state; - self.running4 = false; - - try - { - if (self.awaiter4.GetResult()) - { - self.hasCurrent4 = true; - self.current4 = self.enumerator4.Current; - goto SUCCESS; - } - else - { - self.running4 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running4 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running4 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter4 = self.enumerator4.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter4.SourceOnCompleted(Completed4Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed5(object state) - { - var self = (_CombineLatest)state; - self.running5 = false; - - try - { - if (self.awaiter5.GetResult()) - { - self.hasCurrent5 = true; - self.current5 = self.enumerator5.Current; - goto SUCCESS; - } - else - { - self.running5 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running5 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running5 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter5 = self.enumerator5.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter5.SourceOnCompleted(Completed5Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed6(object state) - { - var self = (_CombineLatest)state; - self.running6 = false; - - try - { - if (self.awaiter6.GetResult()) - { - self.hasCurrent6 = true; - self.current6 = self.enumerator6.Current; - goto SUCCESS; - } - else - { - self.running6 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running6 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running6 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter6 = self.enumerator6.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter6.SourceOnCompleted(Completed6Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed7(object state) - { - var self = (_CombineLatest)state; - self.running7 = false; - - try - { - if (self.awaiter7.GetResult()) - { - self.hasCurrent7 = true; - self.current7 = self.enumerator7.Current; - goto SUCCESS; - } - else - { - self.running7 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running7 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running7 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter7 = self.enumerator7.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter7.SourceOnCompleted(Completed7Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed8(object state) - { - var self = (_CombineLatest)state; - self.running8 = false; - - try - { - if (self.awaiter8.GetResult()) - { - self.hasCurrent8 = true; - self.current8 = self.enumerator8.Current; - goto SUCCESS; - } - else - { - self.running8 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running8 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running8 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter8 = self.enumerator8.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter8.SourceOnCompleted(Completed8Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed9(object state) - { - var self = (_CombineLatest)state; - self.running9 = false; - - try - { - if (self.awaiter9.GetResult()) - { - self.hasCurrent9 = true; - self.current9 = self.enumerator9.Current; - goto SUCCESS; - } - else - { - self.running9 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running9 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running9 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter9 = self.enumerator9.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter9.SourceOnCompleted(Completed9Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - bool TrySetResult() - { - if (hasCurrent1 && hasCurrent2 && hasCurrent3 && hasCurrent4 && hasCurrent5 && hasCurrent6 && hasCurrent7 && hasCurrent8 && hasCurrent9) - { - result = resultSelector(current1, current2, current3, current4, current5, current6, current7, current8, current9); - completionSource.TrySetResult(true); - return true; - } - else - { - return false; - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator1 != null) - { - await enumerator1.DisposeAsync(); - } - if (enumerator2 != null) - { - await enumerator2.DisposeAsync(); - } - if (enumerator3 != null) - { - await enumerator3.DisposeAsync(); - } - if (enumerator4 != null) - { - await enumerator4.DisposeAsync(); - } - if (enumerator5 != null) - { - await enumerator5.DisposeAsync(); - } - if (enumerator6 != null) - { - await enumerator6.DisposeAsync(); - } - if (enumerator7 != null) - { - await enumerator7.DisposeAsync(); - } - if (enumerator8 != null) - { - await enumerator8.DisposeAsync(); - } - if (enumerator9 != null) - { - await enumerator9.DisposeAsync(); - } - } - } - } - - internal class CombineLatest : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - readonly IUniTaskAsyncEnumerable source7; - readonly IUniTaskAsyncEnumerable source8; - readonly IUniTaskAsyncEnumerable source9; - readonly IUniTaskAsyncEnumerable source10; - - readonly Func resultSelector; - - public CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, IUniTaskAsyncEnumerable source10, Func resultSelector) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - this.source7 = source7; - this.source8 = source8; - this.source9 = source9; - this.source10 = source10; - - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _CombineLatest(source1, source2, source3, source4, source5, source6, source7, source8, source9, source10, resultSelector, cancellationToken); - } - - class _CombineLatest : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action Completed1Delegate = Completed1; - static readonly Action Completed2Delegate = Completed2; - static readonly Action Completed3Delegate = Completed3; - static readonly Action Completed4Delegate = Completed4; - static readonly Action Completed5Delegate = Completed5; - static readonly Action Completed6Delegate = Completed6; - static readonly Action Completed7Delegate = Completed7; - static readonly Action Completed8Delegate = Completed8; - static readonly Action Completed9Delegate = Completed9; - static readonly Action Completed10Delegate = Completed10; - const int CompleteCount = 10; - - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - readonly IUniTaskAsyncEnumerable source7; - readonly IUniTaskAsyncEnumerable source8; - readonly IUniTaskAsyncEnumerable source9; - readonly IUniTaskAsyncEnumerable source10; - - readonly Func resultSelector; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator1; - UniTask.Awaiter awaiter1; - bool hasCurrent1; - bool running1; - T1 current1; - - IUniTaskAsyncEnumerator enumerator2; - UniTask.Awaiter awaiter2; - bool hasCurrent2; - bool running2; - T2 current2; - - IUniTaskAsyncEnumerator enumerator3; - UniTask.Awaiter awaiter3; - bool hasCurrent3; - bool running3; - T3 current3; - - IUniTaskAsyncEnumerator enumerator4; - UniTask.Awaiter awaiter4; - bool hasCurrent4; - bool running4; - T4 current4; - - IUniTaskAsyncEnumerator enumerator5; - UniTask.Awaiter awaiter5; - bool hasCurrent5; - bool running5; - T5 current5; - - IUniTaskAsyncEnumerator enumerator6; - UniTask.Awaiter awaiter6; - bool hasCurrent6; - bool running6; - T6 current6; - - IUniTaskAsyncEnumerator enumerator7; - UniTask.Awaiter awaiter7; - bool hasCurrent7; - bool running7; - T7 current7; - - IUniTaskAsyncEnumerator enumerator8; - UniTask.Awaiter awaiter8; - bool hasCurrent8; - bool running8; - T8 current8; - - IUniTaskAsyncEnumerator enumerator9; - UniTask.Awaiter awaiter9; - bool hasCurrent9; - bool running9; - T9 current9; - - IUniTaskAsyncEnumerator enumerator10; - UniTask.Awaiter awaiter10; - bool hasCurrent10; - bool running10; - T10 current10; - - int completedCount; - bool syncRunning; - TResult result; - - public _CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, IUniTaskAsyncEnumerable source10, Func resultSelector, CancellationToken cancellationToken) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - this.source7 = source7; - this.source8 = source8; - this.source9 = source9; - this.source10 = source10; - - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current => result; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - if (completedCount == CompleteCount) return CompletedTasks.False; - - if (enumerator1 == null) - { - enumerator1 = source1.GetAsyncEnumerator(cancellationToken); - enumerator2 = source2.GetAsyncEnumerator(cancellationToken); - enumerator3 = source3.GetAsyncEnumerator(cancellationToken); - enumerator4 = source4.GetAsyncEnumerator(cancellationToken); - enumerator5 = source5.GetAsyncEnumerator(cancellationToken); - enumerator6 = source6.GetAsyncEnumerator(cancellationToken); - enumerator7 = source7.GetAsyncEnumerator(cancellationToken); - enumerator8 = source8.GetAsyncEnumerator(cancellationToken); - enumerator9 = source9.GetAsyncEnumerator(cancellationToken); - enumerator10 = source10.GetAsyncEnumerator(cancellationToken); - } - - completionSource.Reset(); - - AGAIN: - syncRunning = true; - if (!running1) - { - running1 = true; - awaiter1 = enumerator1.MoveNextAsync().GetAwaiter(); - if (awaiter1.IsCompleted) - { - Completed1(this); - } - else - { - awaiter1.SourceOnCompleted(Completed1Delegate, this); - } - } - if (!running2) - { - running2 = true; - awaiter2 = enumerator2.MoveNextAsync().GetAwaiter(); - if (awaiter2.IsCompleted) - { - Completed2(this); - } - else - { - awaiter2.SourceOnCompleted(Completed2Delegate, this); - } - } - if (!running3) - { - running3 = true; - awaiter3 = enumerator3.MoveNextAsync().GetAwaiter(); - if (awaiter3.IsCompleted) - { - Completed3(this); - } - else - { - awaiter3.SourceOnCompleted(Completed3Delegate, this); - } - } - if (!running4) - { - running4 = true; - awaiter4 = enumerator4.MoveNextAsync().GetAwaiter(); - if (awaiter4.IsCompleted) - { - Completed4(this); - } - else - { - awaiter4.SourceOnCompleted(Completed4Delegate, this); - } - } - if (!running5) - { - running5 = true; - awaiter5 = enumerator5.MoveNextAsync().GetAwaiter(); - if (awaiter5.IsCompleted) - { - Completed5(this); - } - else - { - awaiter5.SourceOnCompleted(Completed5Delegate, this); - } - } - if (!running6) - { - running6 = true; - awaiter6 = enumerator6.MoveNextAsync().GetAwaiter(); - if (awaiter6.IsCompleted) - { - Completed6(this); - } - else - { - awaiter6.SourceOnCompleted(Completed6Delegate, this); - } - } - if (!running7) - { - running7 = true; - awaiter7 = enumerator7.MoveNextAsync().GetAwaiter(); - if (awaiter7.IsCompleted) - { - Completed7(this); - } - else - { - awaiter7.SourceOnCompleted(Completed7Delegate, this); - } - } - if (!running8) - { - running8 = true; - awaiter8 = enumerator8.MoveNextAsync().GetAwaiter(); - if (awaiter8.IsCompleted) - { - Completed8(this); - } - else - { - awaiter8.SourceOnCompleted(Completed8Delegate, this); - } - } - if (!running9) - { - running9 = true; - awaiter9 = enumerator9.MoveNextAsync().GetAwaiter(); - if (awaiter9.IsCompleted) - { - Completed9(this); - } - else - { - awaiter9.SourceOnCompleted(Completed9Delegate, this); - } - } - if (!running10) - { - running10 = true; - awaiter10 = enumerator10.MoveNextAsync().GetAwaiter(); - if (awaiter10.IsCompleted) - { - Completed10(this); - } - else - { - awaiter10.SourceOnCompleted(Completed10Delegate, this); - } - } - - if (!running1 || !running2 || !running3 || !running4 || !running5 || !running6 || !running7 || !running8 || !running9 || !running10) - { - goto AGAIN; - } - syncRunning = false; - - return new UniTask(this, completionSource.Version); - } - - static void Completed1(object state) - { - var self = (_CombineLatest)state; - self.running1 = false; - - try - { - if (self.awaiter1.GetResult()) - { - self.hasCurrent1 = true; - self.current1 = self.enumerator1.Current; - goto SUCCESS; - } - else - { - self.running1 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running1 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running1 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter1 = self.enumerator1.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter1.SourceOnCompleted(Completed1Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed2(object state) - { - var self = (_CombineLatest)state; - self.running2 = false; - - try - { - if (self.awaiter2.GetResult()) - { - self.hasCurrent2 = true; - self.current2 = self.enumerator2.Current; - goto SUCCESS; - } - else - { - self.running2 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running2 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running2 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter2 = self.enumerator2.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter2.SourceOnCompleted(Completed2Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed3(object state) - { - var self = (_CombineLatest)state; - self.running3 = false; - - try - { - if (self.awaiter3.GetResult()) - { - self.hasCurrent3 = true; - self.current3 = self.enumerator3.Current; - goto SUCCESS; - } - else - { - self.running3 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running3 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running3 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter3 = self.enumerator3.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter3.SourceOnCompleted(Completed3Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed4(object state) - { - var self = (_CombineLatest)state; - self.running4 = false; - - try - { - if (self.awaiter4.GetResult()) - { - self.hasCurrent4 = true; - self.current4 = self.enumerator4.Current; - goto SUCCESS; - } - else - { - self.running4 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running4 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running4 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter4 = self.enumerator4.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter4.SourceOnCompleted(Completed4Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed5(object state) - { - var self = (_CombineLatest)state; - self.running5 = false; - - try - { - if (self.awaiter5.GetResult()) - { - self.hasCurrent5 = true; - self.current5 = self.enumerator5.Current; - goto SUCCESS; - } - else - { - self.running5 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running5 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running5 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter5 = self.enumerator5.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter5.SourceOnCompleted(Completed5Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed6(object state) - { - var self = (_CombineLatest)state; - self.running6 = false; - - try - { - if (self.awaiter6.GetResult()) - { - self.hasCurrent6 = true; - self.current6 = self.enumerator6.Current; - goto SUCCESS; - } - else - { - self.running6 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running6 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running6 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter6 = self.enumerator6.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter6.SourceOnCompleted(Completed6Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed7(object state) - { - var self = (_CombineLatest)state; - self.running7 = false; - - try - { - if (self.awaiter7.GetResult()) - { - self.hasCurrent7 = true; - self.current7 = self.enumerator7.Current; - goto SUCCESS; - } - else - { - self.running7 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running7 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running7 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter7 = self.enumerator7.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter7.SourceOnCompleted(Completed7Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed8(object state) - { - var self = (_CombineLatest)state; - self.running8 = false; - - try - { - if (self.awaiter8.GetResult()) - { - self.hasCurrent8 = true; - self.current8 = self.enumerator8.Current; - goto SUCCESS; - } - else - { - self.running8 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running8 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running8 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter8 = self.enumerator8.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter8.SourceOnCompleted(Completed8Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed9(object state) - { - var self = (_CombineLatest)state; - self.running9 = false; - - try - { - if (self.awaiter9.GetResult()) - { - self.hasCurrent9 = true; - self.current9 = self.enumerator9.Current; - goto SUCCESS; - } - else - { - self.running9 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running9 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running9 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter9 = self.enumerator9.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter9.SourceOnCompleted(Completed9Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed10(object state) - { - var self = (_CombineLatest)state; - self.running10 = false; - - try - { - if (self.awaiter10.GetResult()) - { - self.hasCurrent10 = true; - self.current10 = self.enumerator10.Current; - goto SUCCESS; - } - else - { - self.running10 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running10 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running10 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter10 = self.enumerator10.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter10.SourceOnCompleted(Completed10Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - bool TrySetResult() - { - if (hasCurrent1 && hasCurrent2 && hasCurrent3 && hasCurrent4 && hasCurrent5 && hasCurrent6 && hasCurrent7 && hasCurrent8 && hasCurrent9 && hasCurrent10) - { - result = resultSelector(current1, current2, current3, current4, current5, current6, current7, current8, current9, current10); - completionSource.TrySetResult(true); - return true; - } - else - { - return false; - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator1 != null) - { - await enumerator1.DisposeAsync(); - } - if (enumerator2 != null) - { - await enumerator2.DisposeAsync(); - } - if (enumerator3 != null) - { - await enumerator3.DisposeAsync(); - } - if (enumerator4 != null) - { - await enumerator4.DisposeAsync(); - } - if (enumerator5 != null) - { - await enumerator5.DisposeAsync(); - } - if (enumerator6 != null) - { - await enumerator6.DisposeAsync(); - } - if (enumerator7 != null) - { - await enumerator7.DisposeAsync(); - } - if (enumerator8 != null) - { - await enumerator8.DisposeAsync(); - } - if (enumerator9 != null) - { - await enumerator9.DisposeAsync(); - } - if (enumerator10 != null) - { - await enumerator10.DisposeAsync(); - } - } - } - } - - internal class CombineLatest : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - readonly IUniTaskAsyncEnumerable source7; - readonly IUniTaskAsyncEnumerable source8; - readonly IUniTaskAsyncEnumerable source9; - readonly IUniTaskAsyncEnumerable source10; - readonly IUniTaskAsyncEnumerable source11; - - readonly Func resultSelector; - - public CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, IUniTaskAsyncEnumerable source10, IUniTaskAsyncEnumerable source11, Func resultSelector) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - this.source7 = source7; - this.source8 = source8; - this.source9 = source9; - this.source10 = source10; - this.source11 = source11; - - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _CombineLatest(source1, source2, source3, source4, source5, source6, source7, source8, source9, source10, source11, resultSelector, cancellationToken); - } - - class _CombineLatest : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action Completed1Delegate = Completed1; - static readonly Action Completed2Delegate = Completed2; - static readonly Action Completed3Delegate = Completed3; - static readonly Action Completed4Delegate = Completed4; - static readonly Action Completed5Delegate = Completed5; - static readonly Action Completed6Delegate = Completed6; - static readonly Action Completed7Delegate = Completed7; - static readonly Action Completed8Delegate = Completed8; - static readonly Action Completed9Delegate = Completed9; - static readonly Action Completed10Delegate = Completed10; - static readonly Action Completed11Delegate = Completed11; - const int CompleteCount = 11; - - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - readonly IUniTaskAsyncEnumerable source7; - readonly IUniTaskAsyncEnumerable source8; - readonly IUniTaskAsyncEnumerable source9; - readonly IUniTaskAsyncEnumerable source10; - readonly IUniTaskAsyncEnumerable source11; - - readonly Func resultSelector; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator1; - UniTask.Awaiter awaiter1; - bool hasCurrent1; - bool running1; - T1 current1; - - IUniTaskAsyncEnumerator enumerator2; - UniTask.Awaiter awaiter2; - bool hasCurrent2; - bool running2; - T2 current2; - - IUniTaskAsyncEnumerator enumerator3; - UniTask.Awaiter awaiter3; - bool hasCurrent3; - bool running3; - T3 current3; - - IUniTaskAsyncEnumerator enumerator4; - UniTask.Awaiter awaiter4; - bool hasCurrent4; - bool running4; - T4 current4; - - IUniTaskAsyncEnumerator enumerator5; - UniTask.Awaiter awaiter5; - bool hasCurrent5; - bool running5; - T5 current5; - - IUniTaskAsyncEnumerator enumerator6; - UniTask.Awaiter awaiter6; - bool hasCurrent6; - bool running6; - T6 current6; - - IUniTaskAsyncEnumerator enumerator7; - UniTask.Awaiter awaiter7; - bool hasCurrent7; - bool running7; - T7 current7; - - IUniTaskAsyncEnumerator enumerator8; - UniTask.Awaiter awaiter8; - bool hasCurrent8; - bool running8; - T8 current8; - - IUniTaskAsyncEnumerator enumerator9; - UniTask.Awaiter awaiter9; - bool hasCurrent9; - bool running9; - T9 current9; - - IUniTaskAsyncEnumerator enumerator10; - UniTask.Awaiter awaiter10; - bool hasCurrent10; - bool running10; - T10 current10; - - IUniTaskAsyncEnumerator enumerator11; - UniTask.Awaiter awaiter11; - bool hasCurrent11; - bool running11; - T11 current11; - - int completedCount; - bool syncRunning; - TResult result; - - public _CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, IUniTaskAsyncEnumerable source10, IUniTaskAsyncEnumerable source11, Func resultSelector, CancellationToken cancellationToken) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - this.source7 = source7; - this.source8 = source8; - this.source9 = source9; - this.source10 = source10; - this.source11 = source11; - - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current => result; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - if (completedCount == CompleteCount) return CompletedTasks.False; - - if (enumerator1 == null) - { - enumerator1 = source1.GetAsyncEnumerator(cancellationToken); - enumerator2 = source2.GetAsyncEnumerator(cancellationToken); - enumerator3 = source3.GetAsyncEnumerator(cancellationToken); - enumerator4 = source4.GetAsyncEnumerator(cancellationToken); - enumerator5 = source5.GetAsyncEnumerator(cancellationToken); - enumerator6 = source6.GetAsyncEnumerator(cancellationToken); - enumerator7 = source7.GetAsyncEnumerator(cancellationToken); - enumerator8 = source8.GetAsyncEnumerator(cancellationToken); - enumerator9 = source9.GetAsyncEnumerator(cancellationToken); - enumerator10 = source10.GetAsyncEnumerator(cancellationToken); - enumerator11 = source11.GetAsyncEnumerator(cancellationToken); - } - - completionSource.Reset(); - - AGAIN: - syncRunning = true; - if (!running1) - { - running1 = true; - awaiter1 = enumerator1.MoveNextAsync().GetAwaiter(); - if (awaiter1.IsCompleted) - { - Completed1(this); - } - else - { - awaiter1.SourceOnCompleted(Completed1Delegate, this); - } - } - if (!running2) - { - running2 = true; - awaiter2 = enumerator2.MoveNextAsync().GetAwaiter(); - if (awaiter2.IsCompleted) - { - Completed2(this); - } - else - { - awaiter2.SourceOnCompleted(Completed2Delegate, this); - } - } - if (!running3) - { - running3 = true; - awaiter3 = enumerator3.MoveNextAsync().GetAwaiter(); - if (awaiter3.IsCompleted) - { - Completed3(this); - } - else - { - awaiter3.SourceOnCompleted(Completed3Delegate, this); - } - } - if (!running4) - { - running4 = true; - awaiter4 = enumerator4.MoveNextAsync().GetAwaiter(); - if (awaiter4.IsCompleted) - { - Completed4(this); - } - else - { - awaiter4.SourceOnCompleted(Completed4Delegate, this); - } - } - if (!running5) - { - running5 = true; - awaiter5 = enumerator5.MoveNextAsync().GetAwaiter(); - if (awaiter5.IsCompleted) - { - Completed5(this); - } - else - { - awaiter5.SourceOnCompleted(Completed5Delegate, this); - } - } - if (!running6) - { - running6 = true; - awaiter6 = enumerator6.MoveNextAsync().GetAwaiter(); - if (awaiter6.IsCompleted) - { - Completed6(this); - } - else - { - awaiter6.SourceOnCompleted(Completed6Delegate, this); - } - } - if (!running7) - { - running7 = true; - awaiter7 = enumerator7.MoveNextAsync().GetAwaiter(); - if (awaiter7.IsCompleted) - { - Completed7(this); - } - else - { - awaiter7.SourceOnCompleted(Completed7Delegate, this); - } - } - if (!running8) - { - running8 = true; - awaiter8 = enumerator8.MoveNextAsync().GetAwaiter(); - if (awaiter8.IsCompleted) - { - Completed8(this); - } - else - { - awaiter8.SourceOnCompleted(Completed8Delegate, this); - } - } - if (!running9) - { - running9 = true; - awaiter9 = enumerator9.MoveNextAsync().GetAwaiter(); - if (awaiter9.IsCompleted) - { - Completed9(this); - } - else - { - awaiter9.SourceOnCompleted(Completed9Delegate, this); - } - } - if (!running10) - { - running10 = true; - awaiter10 = enumerator10.MoveNextAsync().GetAwaiter(); - if (awaiter10.IsCompleted) - { - Completed10(this); - } - else - { - awaiter10.SourceOnCompleted(Completed10Delegate, this); - } - } - if (!running11) - { - running11 = true; - awaiter11 = enumerator11.MoveNextAsync().GetAwaiter(); - if (awaiter11.IsCompleted) - { - Completed11(this); - } - else - { - awaiter11.SourceOnCompleted(Completed11Delegate, this); - } - } - - if (!running1 || !running2 || !running3 || !running4 || !running5 || !running6 || !running7 || !running8 || !running9 || !running10 || !running11) - { - goto AGAIN; - } - syncRunning = false; - - return new UniTask(this, completionSource.Version); - } - - static void Completed1(object state) - { - var self = (_CombineLatest)state; - self.running1 = false; - - try - { - if (self.awaiter1.GetResult()) - { - self.hasCurrent1 = true; - self.current1 = self.enumerator1.Current; - goto SUCCESS; - } - else - { - self.running1 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running1 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running1 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter1 = self.enumerator1.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter1.SourceOnCompleted(Completed1Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed2(object state) - { - var self = (_CombineLatest)state; - self.running2 = false; - - try - { - if (self.awaiter2.GetResult()) - { - self.hasCurrent2 = true; - self.current2 = self.enumerator2.Current; - goto SUCCESS; - } - else - { - self.running2 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running2 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running2 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter2 = self.enumerator2.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter2.SourceOnCompleted(Completed2Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed3(object state) - { - var self = (_CombineLatest)state; - self.running3 = false; - - try - { - if (self.awaiter3.GetResult()) - { - self.hasCurrent3 = true; - self.current3 = self.enumerator3.Current; - goto SUCCESS; - } - else - { - self.running3 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running3 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running3 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter3 = self.enumerator3.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter3.SourceOnCompleted(Completed3Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed4(object state) - { - var self = (_CombineLatest)state; - self.running4 = false; - - try - { - if (self.awaiter4.GetResult()) - { - self.hasCurrent4 = true; - self.current4 = self.enumerator4.Current; - goto SUCCESS; - } - else - { - self.running4 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running4 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running4 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter4 = self.enumerator4.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter4.SourceOnCompleted(Completed4Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed5(object state) - { - var self = (_CombineLatest)state; - self.running5 = false; - - try - { - if (self.awaiter5.GetResult()) - { - self.hasCurrent5 = true; - self.current5 = self.enumerator5.Current; - goto SUCCESS; - } - else - { - self.running5 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running5 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running5 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter5 = self.enumerator5.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter5.SourceOnCompleted(Completed5Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed6(object state) - { - var self = (_CombineLatest)state; - self.running6 = false; - - try - { - if (self.awaiter6.GetResult()) - { - self.hasCurrent6 = true; - self.current6 = self.enumerator6.Current; - goto SUCCESS; - } - else - { - self.running6 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running6 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running6 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter6 = self.enumerator6.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter6.SourceOnCompleted(Completed6Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed7(object state) - { - var self = (_CombineLatest)state; - self.running7 = false; - - try - { - if (self.awaiter7.GetResult()) - { - self.hasCurrent7 = true; - self.current7 = self.enumerator7.Current; - goto SUCCESS; - } - else - { - self.running7 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running7 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running7 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter7 = self.enumerator7.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter7.SourceOnCompleted(Completed7Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed8(object state) - { - var self = (_CombineLatest)state; - self.running8 = false; - - try - { - if (self.awaiter8.GetResult()) - { - self.hasCurrent8 = true; - self.current8 = self.enumerator8.Current; - goto SUCCESS; - } - else - { - self.running8 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running8 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running8 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter8 = self.enumerator8.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter8.SourceOnCompleted(Completed8Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed9(object state) - { - var self = (_CombineLatest)state; - self.running9 = false; - - try - { - if (self.awaiter9.GetResult()) - { - self.hasCurrent9 = true; - self.current9 = self.enumerator9.Current; - goto SUCCESS; - } - else - { - self.running9 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running9 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running9 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter9 = self.enumerator9.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter9.SourceOnCompleted(Completed9Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed10(object state) - { - var self = (_CombineLatest)state; - self.running10 = false; - - try - { - if (self.awaiter10.GetResult()) - { - self.hasCurrent10 = true; - self.current10 = self.enumerator10.Current; - goto SUCCESS; - } - else - { - self.running10 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running10 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running10 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter10 = self.enumerator10.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter10.SourceOnCompleted(Completed10Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed11(object state) - { - var self = (_CombineLatest)state; - self.running11 = false; - - try - { - if (self.awaiter11.GetResult()) - { - self.hasCurrent11 = true; - self.current11 = self.enumerator11.Current; - goto SUCCESS; - } - else - { - self.running11 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running11 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running11 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter11 = self.enumerator11.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter11.SourceOnCompleted(Completed11Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - bool TrySetResult() - { - if (hasCurrent1 && hasCurrent2 && hasCurrent3 && hasCurrent4 && hasCurrent5 && hasCurrent6 && hasCurrent7 && hasCurrent8 && hasCurrent9 && hasCurrent10 && hasCurrent11) - { - result = resultSelector(current1, current2, current3, current4, current5, current6, current7, current8, current9, current10, current11); - completionSource.TrySetResult(true); - return true; - } - else - { - return false; - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator1 != null) - { - await enumerator1.DisposeAsync(); - } - if (enumerator2 != null) - { - await enumerator2.DisposeAsync(); - } - if (enumerator3 != null) - { - await enumerator3.DisposeAsync(); - } - if (enumerator4 != null) - { - await enumerator4.DisposeAsync(); - } - if (enumerator5 != null) - { - await enumerator5.DisposeAsync(); - } - if (enumerator6 != null) - { - await enumerator6.DisposeAsync(); - } - if (enumerator7 != null) - { - await enumerator7.DisposeAsync(); - } - if (enumerator8 != null) - { - await enumerator8.DisposeAsync(); - } - if (enumerator9 != null) - { - await enumerator9.DisposeAsync(); - } - if (enumerator10 != null) - { - await enumerator10.DisposeAsync(); - } - if (enumerator11 != null) - { - await enumerator11.DisposeAsync(); - } - } - } - } - - internal class CombineLatest : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - readonly IUniTaskAsyncEnumerable source7; - readonly IUniTaskAsyncEnumerable source8; - readonly IUniTaskAsyncEnumerable source9; - readonly IUniTaskAsyncEnumerable source10; - readonly IUniTaskAsyncEnumerable source11; - readonly IUniTaskAsyncEnumerable source12; - - readonly Func resultSelector; - - public CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, IUniTaskAsyncEnumerable source10, IUniTaskAsyncEnumerable source11, IUniTaskAsyncEnumerable source12, Func resultSelector) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - this.source7 = source7; - this.source8 = source8; - this.source9 = source9; - this.source10 = source10; - this.source11 = source11; - this.source12 = source12; - - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _CombineLatest(source1, source2, source3, source4, source5, source6, source7, source8, source9, source10, source11, source12, resultSelector, cancellationToken); - } - - class _CombineLatest : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action Completed1Delegate = Completed1; - static readonly Action Completed2Delegate = Completed2; - static readonly Action Completed3Delegate = Completed3; - static readonly Action Completed4Delegate = Completed4; - static readonly Action Completed5Delegate = Completed5; - static readonly Action Completed6Delegate = Completed6; - static readonly Action Completed7Delegate = Completed7; - static readonly Action Completed8Delegate = Completed8; - static readonly Action Completed9Delegate = Completed9; - static readonly Action Completed10Delegate = Completed10; - static readonly Action Completed11Delegate = Completed11; - static readonly Action Completed12Delegate = Completed12; - const int CompleteCount = 12; - - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - readonly IUniTaskAsyncEnumerable source7; - readonly IUniTaskAsyncEnumerable source8; - readonly IUniTaskAsyncEnumerable source9; - readonly IUniTaskAsyncEnumerable source10; - readonly IUniTaskAsyncEnumerable source11; - readonly IUniTaskAsyncEnumerable source12; - - readonly Func resultSelector; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator1; - UniTask.Awaiter awaiter1; - bool hasCurrent1; - bool running1; - T1 current1; - - IUniTaskAsyncEnumerator enumerator2; - UniTask.Awaiter awaiter2; - bool hasCurrent2; - bool running2; - T2 current2; - - IUniTaskAsyncEnumerator enumerator3; - UniTask.Awaiter awaiter3; - bool hasCurrent3; - bool running3; - T3 current3; - - IUniTaskAsyncEnumerator enumerator4; - UniTask.Awaiter awaiter4; - bool hasCurrent4; - bool running4; - T4 current4; - - IUniTaskAsyncEnumerator enumerator5; - UniTask.Awaiter awaiter5; - bool hasCurrent5; - bool running5; - T5 current5; - - IUniTaskAsyncEnumerator enumerator6; - UniTask.Awaiter awaiter6; - bool hasCurrent6; - bool running6; - T6 current6; - - IUniTaskAsyncEnumerator enumerator7; - UniTask.Awaiter awaiter7; - bool hasCurrent7; - bool running7; - T7 current7; - - IUniTaskAsyncEnumerator enumerator8; - UniTask.Awaiter awaiter8; - bool hasCurrent8; - bool running8; - T8 current8; - - IUniTaskAsyncEnumerator enumerator9; - UniTask.Awaiter awaiter9; - bool hasCurrent9; - bool running9; - T9 current9; - - IUniTaskAsyncEnumerator enumerator10; - UniTask.Awaiter awaiter10; - bool hasCurrent10; - bool running10; - T10 current10; - - IUniTaskAsyncEnumerator enumerator11; - UniTask.Awaiter awaiter11; - bool hasCurrent11; - bool running11; - T11 current11; - - IUniTaskAsyncEnumerator enumerator12; - UniTask.Awaiter awaiter12; - bool hasCurrent12; - bool running12; - T12 current12; - - int completedCount; - bool syncRunning; - TResult result; - - public _CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, IUniTaskAsyncEnumerable source10, IUniTaskAsyncEnumerable source11, IUniTaskAsyncEnumerable source12, Func resultSelector, CancellationToken cancellationToken) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - this.source7 = source7; - this.source8 = source8; - this.source9 = source9; - this.source10 = source10; - this.source11 = source11; - this.source12 = source12; - - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current => result; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - if (completedCount == CompleteCount) return CompletedTasks.False; - - if (enumerator1 == null) - { - enumerator1 = source1.GetAsyncEnumerator(cancellationToken); - enumerator2 = source2.GetAsyncEnumerator(cancellationToken); - enumerator3 = source3.GetAsyncEnumerator(cancellationToken); - enumerator4 = source4.GetAsyncEnumerator(cancellationToken); - enumerator5 = source5.GetAsyncEnumerator(cancellationToken); - enumerator6 = source6.GetAsyncEnumerator(cancellationToken); - enumerator7 = source7.GetAsyncEnumerator(cancellationToken); - enumerator8 = source8.GetAsyncEnumerator(cancellationToken); - enumerator9 = source9.GetAsyncEnumerator(cancellationToken); - enumerator10 = source10.GetAsyncEnumerator(cancellationToken); - enumerator11 = source11.GetAsyncEnumerator(cancellationToken); - enumerator12 = source12.GetAsyncEnumerator(cancellationToken); - } - - completionSource.Reset(); - - AGAIN: - syncRunning = true; - if (!running1) - { - running1 = true; - awaiter1 = enumerator1.MoveNextAsync().GetAwaiter(); - if (awaiter1.IsCompleted) - { - Completed1(this); - } - else - { - awaiter1.SourceOnCompleted(Completed1Delegate, this); - } - } - if (!running2) - { - running2 = true; - awaiter2 = enumerator2.MoveNextAsync().GetAwaiter(); - if (awaiter2.IsCompleted) - { - Completed2(this); - } - else - { - awaiter2.SourceOnCompleted(Completed2Delegate, this); - } - } - if (!running3) - { - running3 = true; - awaiter3 = enumerator3.MoveNextAsync().GetAwaiter(); - if (awaiter3.IsCompleted) - { - Completed3(this); - } - else - { - awaiter3.SourceOnCompleted(Completed3Delegate, this); - } - } - if (!running4) - { - running4 = true; - awaiter4 = enumerator4.MoveNextAsync().GetAwaiter(); - if (awaiter4.IsCompleted) - { - Completed4(this); - } - else - { - awaiter4.SourceOnCompleted(Completed4Delegate, this); - } - } - if (!running5) - { - running5 = true; - awaiter5 = enumerator5.MoveNextAsync().GetAwaiter(); - if (awaiter5.IsCompleted) - { - Completed5(this); - } - else - { - awaiter5.SourceOnCompleted(Completed5Delegate, this); - } - } - if (!running6) - { - running6 = true; - awaiter6 = enumerator6.MoveNextAsync().GetAwaiter(); - if (awaiter6.IsCompleted) - { - Completed6(this); - } - else - { - awaiter6.SourceOnCompleted(Completed6Delegate, this); - } - } - if (!running7) - { - running7 = true; - awaiter7 = enumerator7.MoveNextAsync().GetAwaiter(); - if (awaiter7.IsCompleted) - { - Completed7(this); - } - else - { - awaiter7.SourceOnCompleted(Completed7Delegate, this); - } - } - if (!running8) - { - running8 = true; - awaiter8 = enumerator8.MoveNextAsync().GetAwaiter(); - if (awaiter8.IsCompleted) - { - Completed8(this); - } - else - { - awaiter8.SourceOnCompleted(Completed8Delegate, this); - } - } - if (!running9) - { - running9 = true; - awaiter9 = enumerator9.MoveNextAsync().GetAwaiter(); - if (awaiter9.IsCompleted) - { - Completed9(this); - } - else - { - awaiter9.SourceOnCompleted(Completed9Delegate, this); - } - } - if (!running10) - { - running10 = true; - awaiter10 = enumerator10.MoveNextAsync().GetAwaiter(); - if (awaiter10.IsCompleted) - { - Completed10(this); - } - else - { - awaiter10.SourceOnCompleted(Completed10Delegate, this); - } - } - if (!running11) - { - running11 = true; - awaiter11 = enumerator11.MoveNextAsync().GetAwaiter(); - if (awaiter11.IsCompleted) - { - Completed11(this); - } - else - { - awaiter11.SourceOnCompleted(Completed11Delegate, this); - } - } - if (!running12) - { - running12 = true; - awaiter12 = enumerator12.MoveNextAsync().GetAwaiter(); - if (awaiter12.IsCompleted) - { - Completed12(this); - } - else - { - awaiter12.SourceOnCompleted(Completed12Delegate, this); - } - } - - if (!running1 || !running2 || !running3 || !running4 || !running5 || !running6 || !running7 || !running8 || !running9 || !running10 || !running11 || !running12) - { - goto AGAIN; - } - syncRunning = false; - - return new UniTask(this, completionSource.Version); - } - - static void Completed1(object state) - { - var self = (_CombineLatest)state; - self.running1 = false; - - try - { - if (self.awaiter1.GetResult()) - { - self.hasCurrent1 = true; - self.current1 = self.enumerator1.Current; - goto SUCCESS; - } - else - { - self.running1 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running1 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running1 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter1 = self.enumerator1.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter1.SourceOnCompleted(Completed1Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed2(object state) - { - var self = (_CombineLatest)state; - self.running2 = false; - - try - { - if (self.awaiter2.GetResult()) - { - self.hasCurrent2 = true; - self.current2 = self.enumerator2.Current; - goto SUCCESS; - } - else - { - self.running2 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running2 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running2 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter2 = self.enumerator2.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter2.SourceOnCompleted(Completed2Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed3(object state) - { - var self = (_CombineLatest)state; - self.running3 = false; - - try - { - if (self.awaiter3.GetResult()) - { - self.hasCurrent3 = true; - self.current3 = self.enumerator3.Current; - goto SUCCESS; - } - else - { - self.running3 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running3 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running3 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter3 = self.enumerator3.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter3.SourceOnCompleted(Completed3Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed4(object state) - { - var self = (_CombineLatest)state; - self.running4 = false; - - try - { - if (self.awaiter4.GetResult()) - { - self.hasCurrent4 = true; - self.current4 = self.enumerator4.Current; - goto SUCCESS; - } - else - { - self.running4 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running4 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running4 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter4 = self.enumerator4.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter4.SourceOnCompleted(Completed4Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed5(object state) - { - var self = (_CombineLatest)state; - self.running5 = false; - - try - { - if (self.awaiter5.GetResult()) - { - self.hasCurrent5 = true; - self.current5 = self.enumerator5.Current; - goto SUCCESS; - } - else - { - self.running5 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running5 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running5 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter5 = self.enumerator5.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter5.SourceOnCompleted(Completed5Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed6(object state) - { - var self = (_CombineLatest)state; - self.running6 = false; - - try - { - if (self.awaiter6.GetResult()) - { - self.hasCurrent6 = true; - self.current6 = self.enumerator6.Current; - goto SUCCESS; - } - else - { - self.running6 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running6 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running6 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter6 = self.enumerator6.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter6.SourceOnCompleted(Completed6Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed7(object state) - { - var self = (_CombineLatest)state; - self.running7 = false; - - try - { - if (self.awaiter7.GetResult()) - { - self.hasCurrent7 = true; - self.current7 = self.enumerator7.Current; - goto SUCCESS; - } - else - { - self.running7 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running7 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running7 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter7 = self.enumerator7.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter7.SourceOnCompleted(Completed7Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed8(object state) - { - var self = (_CombineLatest)state; - self.running8 = false; - - try - { - if (self.awaiter8.GetResult()) - { - self.hasCurrent8 = true; - self.current8 = self.enumerator8.Current; - goto SUCCESS; - } - else - { - self.running8 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running8 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running8 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter8 = self.enumerator8.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter8.SourceOnCompleted(Completed8Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed9(object state) - { - var self = (_CombineLatest)state; - self.running9 = false; - - try - { - if (self.awaiter9.GetResult()) - { - self.hasCurrent9 = true; - self.current9 = self.enumerator9.Current; - goto SUCCESS; - } - else - { - self.running9 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running9 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running9 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter9 = self.enumerator9.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter9.SourceOnCompleted(Completed9Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed10(object state) - { - var self = (_CombineLatest)state; - self.running10 = false; - - try - { - if (self.awaiter10.GetResult()) - { - self.hasCurrent10 = true; - self.current10 = self.enumerator10.Current; - goto SUCCESS; - } - else - { - self.running10 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running10 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running10 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter10 = self.enumerator10.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter10.SourceOnCompleted(Completed10Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed11(object state) - { - var self = (_CombineLatest)state; - self.running11 = false; - - try - { - if (self.awaiter11.GetResult()) - { - self.hasCurrent11 = true; - self.current11 = self.enumerator11.Current; - goto SUCCESS; - } - else - { - self.running11 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running11 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running11 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter11 = self.enumerator11.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter11.SourceOnCompleted(Completed11Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed12(object state) - { - var self = (_CombineLatest)state; - self.running12 = false; - - try - { - if (self.awaiter12.GetResult()) - { - self.hasCurrent12 = true; - self.current12 = self.enumerator12.Current; - goto SUCCESS; - } - else - { - self.running12 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running12 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running12 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter12 = self.enumerator12.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter12.SourceOnCompleted(Completed12Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - bool TrySetResult() - { - if (hasCurrent1 && hasCurrent2 && hasCurrent3 && hasCurrent4 && hasCurrent5 && hasCurrent6 && hasCurrent7 && hasCurrent8 && hasCurrent9 && hasCurrent10 && hasCurrent11 && hasCurrent12) - { - result = resultSelector(current1, current2, current3, current4, current5, current6, current7, current8, current9, current10, current11, current12); - completionSource.TrySetResult(true); - return true; - } - else - { - return false; - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator1 != null) - { - await enumerator1.DisposeAsync(); - } - if (enumerator2 != null) - { - await enumerator2.DisposeAsync(); - } - if (enumerator3 != null) - { - await enumerator3.DisposeAsync(); - } - if (enumerator4 != null) - { - await enumerator4.DisposeAsync(); - } - if (enumerator5 != null) - { - await enumerator5.DisposeAsync(); - } - if (enumerator6 != null) - { - await enumerator6.DisposeAsync(); - } - if (enumerator7 != null) - { - await enumerator7.DisposeAsync(); - } - if (enumerator8 != null) - { - await enumerator8.DisposeAsync(); - } - if (enumerator9 != null) - { - await enumerator9.DisposeAsync(); - } - if (enumerator10 != null) - { - await enumerator10.DisposeAsync(); - } - if (enumerator11 != null) - { - await enumerator11.DisposeAsync(); - } - if (enumerator12 != null) - { - await enumerator12.DisposeAsync(); - } - } - } - } - - internal class CombineLatest : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - readonly IUniTaskAsyncEnumerable source7; - readonly IUniTaskAsyncEnumerable source8; - readonly IUniTaskAsyncEnumerable source9; - readonly IUniTaskAsyncEnumerable source10; - readonly IUniTaskAsyncEnumerable source11; - readonly IUniTaskAsyncEnumerable source12; - readonly IUniTaskAsyncEnumerable source13; - - readonly Func resultSelector; - - public CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, IUniTaskAsyncEnumerable source10, IUniTaskAsyncEnumerable source11, IUniTaskAsyncEnumerable source12, IUniTaskAsyncEnumerable source13, Func resultSelector) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - this.source7 = source7; - this.source8 = source8; - this.source9 = source9; - this.source10 = source10; - this.source11 = source11; - this.source12 = source12; - this.source13 = source13; - - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _CombineLatest(source1, source2, source3, source4, source5, source6, source7, source8, source9, source10, source11, source12, source13, resultSelector, cancellationToken); - } - - class _CombineLatest : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action Completed1Delegate = Completed1; - static readonly Action Completed2Delegate = Completed2; - static readonly Action Completed3Delegate = Completed3; - static readonly Action Completed4Delegate = Completed4; - static readonly Action Completed5Delegate = Completed5; - static readonly Action Completed6Delegate = Completed6; - static readonly Action Completed7Delegate = Completed7; - static readonly Action Completed8Delegate = Completed8; - static readonly Action Completed9Delegate = Completed9; - static readonly Action Completed10Delegate = Completed10; - static readonly Action Completed11Delegate = Completed11; - static readonly Action Completed12Delegate = Completed12; - static readonly Action Completed13Delegate = Completed13; - const int CompleteCount = 13; - - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - readonly IUniTaskAsyncEnumerable source7; - readonly IUniTaskAsyncEnumerable source8; - readonly IUniTaskAsyncEnumerable source9; - readonly IUniTaskAsyncEnumerable source10; - readonly IUniTaskAsyncEnumerable source11; - readonly IUniTaskAsyncEnumerable source12; - readonly IUniTaskAsyncEnumerable source13; - - readonly Func resultSelector; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator1; - UniTask.Awaiter awaiter1; - bool hasCurrent1; - bool running1; - T1 current1; - - IUniTaskAsyncEnumerator enumerator2; - UniTask.Awaiter awaiter2; - bool hasCurrent2; - bool running2; - T2 current2; - - IUniTaskAsyncEnumerator enumerator3; - UniTask.Awaiter awaiter3; - bool hasCurrent3; - bool running3; - T3 current3; - - IUniTaskAsyncEnumerator enumerator4; - UniTask.Awaiter awaiter4; - bool hasCurrent4; - bool running4; - T4 current4; - - IUniTaskAsyncEnumerator enumerator5; - UniTask.Awaiter awaiter5; - bool hasCurrent5; - bool running5; - T5 current5; - - IUniTaskAsyncEnumerator enumerator6; - UniTask.Awaiter awaiter6; - bool hasCurrent6; - bool running6; - T6 current6; - - IUniTaskAsyncEnumerator enumerator7; - UniTask.Awaiter awaiter7; - bool hasCurrent7; - bool running7; - T7 current7; - - IUniTaskAsyncEnumerator enumerator8; - UniTask.Awaiter awaiter8; - bool hasCurrent8; - bool running8; - T8 current8; - - IUniTaskAsyncEnumerator enumerator9; - UniTask.Awaiter awaiter9; - bool hasCurrent9; - bool running9; - T9 current9; - - IUniTaskAsyncEnumerator enumerator10; - UniTask.Awaiter awaiter10; - bool hasCurrent10; - bool running10; - T10 current10; - - IUniTaskAsyncEnumerator enumerator11; - UniTask.Awaiter awaiter11; - bool hasCurrent11; - bool running11; - T11 current11; - - IUniTaskAsyncEnumerator enumerator12; - UniTask.Awaiter awaiter12; - bool hasCurrent12; - bool running12; - T12 current12; - - IUniTaskAsyncEnumerator enumerator13; - UniTask.Awaiter awaiter13; - bool hasCurrent13; - bool running13; - T13 current13; - - int completedCount; - bool syncRunning; - TResult result; - - public _CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, IUniTaskAsyncEnumerable source10, IUniTaskAsyncEnumerable source11, IUniTaskAsyncEnumerable source12, IUniTaskAsyncEnumerable source13, Func resultSelector, CancellationToken cancellationToken) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - this.source7 = source7; - this.source8 = source8; - this.source9 = source9; - this.source10 = source10; - this.source11 = source11; - this.source12 = source12; - this.source13 = source13; - - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current => result; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - if (completedCount == CompleteCount) return CompletedTasks.False; - - if (enumerator1 == null) - { - enumerator1 = source1.GetAsyncEnumerator(cancellationToken); - enumerator2 = source2.GetAsyncEnumerator(cancellationToken); - enumerator3 = source3.GetAsyncEnumerator(cancellationToken); - enumerator4 = source4.GetAsyncEnumerator(cancellationToken); - enumerator5 = source5.GetAsyncEnumerator(cancellationToken); - enumerator6 = source6.GetAsyncEnumerator(cancellationToken); - enumerator7 = source7.GetAsyncEnumerator(cancellationToken); - enumerator8 = source8.GetAsyncEnumerator(cancellationToken); - enumerator9 = source9.GetAsyncEnumerator(cancellationToken); - enumerator10 = source10.GetAsyncEnumerator(cancellationToken); - enumerator11 = source11.GetAsyncEnumerator(cancellationToken); - enumerator12 = source12.GetAsyncEnumerator(cancellationToken); - enumerator13 = source13.GetAsyncEnumerator(cancellationToken); - } - - completionSource.Reset(); - - AGAIN: - syncRunning = true; - if (!running1) - { - running1 = true; - awaiter1 = enumerator1.MoveNextAsync().GetAwaiter(); - if (awaiter1.IsCompleted) - { - Completed1(this); - } - else - { - awaiter1.SourceOnCompleted(Completed1Delegate, this); - } - } - if (!running2) - { - running2 = true; - awaiter2 = enumerator2.MoveNextAsync().GetAwaiter(); - if (awaiter2.IsCompleted) - { - Completed2(this); - } - else - { - awaiter2.SourceOnCompleted(Completed2Delegate, this); - } - } - if (!running3) - { - running3 = true; - awaiter3 = enumerator3.MoveNextAsync().GetAwaiter(); - if (awaiter3.IsCompleted) - { - Completed3(this); - } - else - { - awaiter3.SourceOnCompleted(Completed3Delegate, this); - } - } - if (!running4) - { - running4 = true; - awaiter4 = enumerator4.MoveNextAsync().GetAwaiter(); - if (awaiter4.IsCompleted) - { - Completed4(this); - } - else - { - awaiter4.SourceOnCompleted(Completed4Delegate, this); - } - } - if (!running5) - { - running5 = true; - awaiter5 = enumerator5.MoveNextAsync().GetAwaiter(); - if (awaiter5.IsCompleted) - { - Completed5(this); - } - else - { - awaiter5.SourceOnCompleted(Completed5Delegate, this); - } - } - if (!running6) - { - running6 = true; - awaiter6 = enumerator6.MoveNextAsync().GetAwaiter(); - if (awaiter6.IsCompleted) - { - Completed6(this); - } - else - { - awaiter6.SourceOnCompleted(Completed6Delegate, this); - } - } - if (!running7) - { - running7 = true; - awaiter7 = enumerator7.MoveNextAsync().GetAwaiter(); - if (awaiter7.IsCompleted) - { - Completed7(this); - } - else - { - awaiter7.SourceOnCompleted(Completed7Delegate, this); - } - } - if (!running8) - { - running8 = true; - awaiter8 = enumerator8.MoveNextAsync().GetAwaiter(); - if (awaiter8.IsCompleted) - { - Completed8(this); - } - else - { - awaiter8.SourceOnCompleted(Completed8Delegate, this); - } - } - if (!running9) - { - running9 = true; - awaiter9 = enumerator9.MoveNextAsync().GetAwaiter(); - if (awaiter9.IsCompleted) - { - Completed9(this); - } - else - { - awaiter9.SourceOnCompleted(Completed9Delegate, this); - } - } - if (!running10) - { - running10 = true; - awaiter10 = enumerator10.MoveNextAsync().GetAwaiter(); - if (awaiter10.IsCompleted) - { - Completed10(this); - } - else - { - awaiter10.SourceOnCompleted(Completed10Delegate, this); - } - } - if (!running11) - { - running11 = true; - awaiter11 = enumerator11.MoveNextAsync().GetAwaiter(); - if (awaiter11.IsCompleted) - { - Completed11(this); - } - else - { - awaiter11.SourceOnCompleted(Completed11Delegate, this); - } - } - if (!running12) - { - running12 = true; - awaiter12 = enumerator12.MoveNextAsync().GetAwaiter(); - if (awaiter12.IsCompleted) - { - Completed12(this); - } - else - { - awaiter12.SourceOnCompleted(Completed12Delegate, this); - } - } - if (!running13) - { - running13 = true; - awaiter13 = enumerator13.MoveNextAsync().GetAwaiter(); - if (awaiter13.IsCompleted) - { - Completed13(this); - } - else - { - awaiter13.SourceOnCompleted(Completed13Delegate, this); - } - } - - if (!running1 || !running2 || !running3 || !running4 || !running5 || !running6 || !running7 || !running8 || !running9 || !running10 || !running11 || !running12 || !running13) - { - goto AGAIN; - } - syncRunning = false; - - return new UniTask(this, completionSource.Version); - } - - static void Completed1(object state) - { - var self = (_CombineLatest)state; - self.running1 = false; - - try - { - if (self.awaiter1.GetResult()) - { - self.hasCurrent1 = true; - self.current1 = self.enumerator1.Current; - goto SUCCESS; - } - else - { - self.running1 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running1 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running1 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter1 = self.enumerator1.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter1.SourceOnCompleted(Completed1Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed2(object state) - { - var self = (_CombineLatest)state; - self.running2 = false; - - try - { - if (self.awaiter2.GetResult()) - { - self.hasCurrent2 = true; - self.current2 = self.enumerator2.Current; - goto SUCCESS; - } - else - { - self.running2 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running2 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running2 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter2 = self.enumerator2.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter2.SourceOnCompleted(Completed2Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed3(object state) - { - var self = (_CombineLatest)state; - self.running3 = false; - - try - { - if (self.awaiter3.GetResult()) - { - self.hasCurrent3 = true; - self.current3 = self.enumerator3.Current; - goto SUCCESS; - } - else - { - self.running3 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running3 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running3 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter3 = self.enumerator3.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter3.SourceOnCompleted(Completed3Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed4(object state) - { - var self = (_CombineLatest)state; - self.running4 = false; - - try - { - if (self.awaiter4.GetResult()) - { - self.hasCurrent4 = true; - self.current4 = self.enumerator4.Current; - goto SUCCESS; - } - else - { - self.running4 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running4 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running4 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter4 = self.enumerator4.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter4.SourceOnCompleted(Completed4Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed5(object state) - { - var self = (_CombineLatest)state; - self.running5 = false; - - try - { - if (self.awaiter5.GetResult()) - { - self.hasCurrent5 = true; - self.current5 = self.enumerator5.Current; - goto SUCCESS; - } - else - { - self.running5 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running5 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running5 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter5 = self.enumerator5.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter5.SourceOnCompleted(Completed5Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed6(object state) - { - var self = (_CombineLatest)state; - self.running6 = false; - - try - { - if (self.awaiter6.GetResult()) - { - self.hasCurrent6 = true; - self.current6 = self.enumerator6.Current; - goto SUCCESS; - } - else - { - self.running6 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running6 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running6 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter6 = self.enumerator6.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter6.SourceOnCompleted(Completed6Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed7(object state) - { - var self = (_CombineLatest)state; - self.running7 = false; - - try - { - if (self.awaiter7.GetResult()) - { - self.hasCurrent7 = true; - self.current7 = self.enumerator7.Current; - goto SUCCESS; - } - else - { - self.running7 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running7 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running7 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter7 = self.enumerator7.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter7.SourceOnCompleted(Completed7Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed8(object state) - { - var self = (_CombineLatest)state; - self.running8 = false; - - try - { - if (self.awaiter8.GetResult()) - { - self.hasCurrent8 = true; - self.current8 = self.enumerator8.Current; - goto SUCCESS; - } - else - { - self.running8 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running8 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running8 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter8 = self.enumerator8.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter8.SourceOnCompleted(Completed8Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed9(object state) - { - var self = (_CombineLatest)state; - self.running9 = false; - - try - { - if (self.awaiter9.GetResult()) - { - self.hasCurrent9 = true; - self.current9 = self.enumerator9.Current; - goto SUCCESS; - } - else - { - self.running9 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running9 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running9 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter9 = self.enumerator9.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter9.SourceOnCompleted(Completed9Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed10(object state) - { - var self = (_CombineLatest)state; - self.running10 = false; - - try - { - if (self.awaiter10.GetResult()) - { - self.hasCurrent10 = true; - self.current10 = self.enumerator10.Current; - goto SUCCESS; - } - else - { - self.running10 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running10 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running10 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter10 = self.enumerator10.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter10.SourceOnCompleted(Completed10Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed11(object state) - { - var self = (_CombineLatest)state; - self.running11 = false; - - try - { - if (self.awaiter11.GetResult()) - { - self.hasCurrent11 = true; - self.current11 = self.enumerator11.Current; - goto SUCCESS; - } - else - { - self.running11 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running11 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running11 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter11 = self.enumerator11.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter11.SourceOnCompleted(Completed11Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed12(object state) - { - var self = (_CombineLatest)state; - self.running12 = false; - - try - { - if (self.awaiter12.GetResult()) - { - self.hasCurrent12 = true; - self.current12 = self.enumerator12.Current; - goto SUCCESS; - } - else - { - self.running12 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running12 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running12 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter12 = self.enumerator12.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter12.SourceOnCompleted(Completed12Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed13(object state) - { - var self = (_CombineLatest)state; - self.running13 = false; - - try - { - if (self.awaiter13.GetResult()) - { - self.hasCurrent13 = true; - self.current13 = self.enumerator13.Current; - goto SUCCESS; - } - else - { - self.running13 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running13 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running13 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter13 = self.enumerator13.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter13.SourceOnCompleted(Completed13Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - bool TrySetResult() - { - if (hasCurrent1 && hasCurrent2 && hasCurrent3 && hasCurrent4 && hasCurrent5 && hasCurrent6 && hasCurrent7 && hasCurrent8 && hasCurrent9 && hasCurrent10 && hasCurrent11 && hasCurrent12 && hasCurrent13) - { - result = resultSelector(current1, current2, current3, current4, current5, current6, current7, current8, current9, current10, current11, current12, current13); - completionSource.TrySetResult(true); - return true; - } - else - { - return false; - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator1 != null) - { - await enumerator1.DisposeAsync(); - } - if (enumerator2 != null) - { - await enumerator2.DisposeAsync(); - } - if (enumerator3 != null) - { - await enumerator3.DisposeAsync(); - } - if (enumerator4 != null) - { - await enumerator4.DisposeAsync(); - } - if (enumerator5 != null) - { - await enumerator5.DisposeAsync(); - } - if (enumerator6 != null) - { - await enumerator6.DisposeAsync(); - } - if (enumerator7 != null) - { - await enumerator7.DisposeAsync(); - } - if (enumerator8 != null) - { - await enumerator8.DisposeAsync(); - } - if (enumerator9 != null) - { - await enumerator9.DisposeAsync(); - } - if (enumerator10 != null) - { - await enumerator10.DisposeAsync(); - } - if (enumerator11 != null) - { - await enumerator11.DisposeAsync(); - } - if (enumerator12 != null) - { - await enumerator12.DisposeAsync(); - } - if (enumerator13 != null) - { - await enumerator13.DisposeAsync(); - } - } - } - } - - internal class CombineLatest : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - readonly IUniTaskAsyncEnumerable source7; - readonly IUniTaskAsyncEnumerable source8; - readonly IUniTaskAsyncEnumerable source9; - readonly IUniTaskAsyncEnumerable source10; - readonly IUniTaskAsyncEnumerable source11; - readonly IUniTaskAsyncEnumerable source12; - readonly IUniTaskAsyncEnumerable source13; - readonly IUniTaskAsyncEnumerable source14; - - readonly Func resultSelector; - - public CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, IUniTaskAsyncEnumerable source10, IUniTaskAsyncEnumerable source11, IUniTaskAsyncEnumerable source12, IUniTaskAsyncEnumerable source13, IUniTaskAsyncEnumerable source14, Func resultSelector) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - this.source7 = source7; - this.source8 = source8; - this.source9 = source9; - this.source10 = source10; - this.source11 = source11; - this.source12 = source12; - this.source13 = source13; - this.source14 = source14; - - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _CombineLatest(source1, source2, source3, source4, source5, source6, source7, source8, source9, source10, source11, source12, source13, source14, resultSelector, cancellationToken); - } - - class _CombineLatest : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action Completed1Delegate = Completed1; - static readonly Action Completed2Delegate = Completed2; - static readonly Action Completed3Delegate = Completed3; - static readonly Action Completed4Delegate = Completed4; - static readonly Action Completed5Delegate = Completed5; - static readonly Action Completed6Delegate = Completed6; - static readonly Action Completed7Delegate = Completed7; - static readonly Action Completed8Delegate = Completed8; - static readonly Action Completed9Delegate = Completed9; - static readonly Action Completed10Delegate = Completed10; - static readonly Action Completed11Delegate = Completed11; - static readonly Action Completed12Delegate = Completed12; - static readonly Action Completed13Delegate = Completed13; - static readonly Action Completed14Delegate = Completed14; - const int CompleteCount = 14; - - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - readonly IUniTaskAsyncEnumerable source7; - readonly IUniTaskAsyncEnumerable source8; - readonly IUniTaskAsyncEnumerable source9; - readonly IUniTaskAsyncEnumerable source10; - readonly IUniTaskAsyncEnumerable source11; - readonly IUniTaskAsyncEnumerable source12; - readonly IUniTaskAsyncEnumerable source13; - readonly IUniTaskAsyncEnumerable source14; - - readonly Func resultSelector; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator1; - UniTask.Awaiter awaiter1; - bool hasCurrent1; - bool running1; - T1 current1; - - IUniTaskAsyncEnumerator enumerator2; - UniTask.Awaiter awaiter2; - bool hasCurrent2; - bool running2; - T2 current2; - - IUniTaskAsyncEnumerator enumerator3; - UniTask.Awaiter awaiter3; - bool hasCurrent3; - bool running3; - T3 current3; - - IUniTaskAsyncEnumerator enumerator4; - UniTask.Awaiter awaiter4; - bool hasCurrent4; - bool running4; - T4 current4; - - IUniTaskAsyncEnumerator enumerator5; - UniTask.Awaiter awaiter5; - bool hasCurrent5; - bool running5; - T5 current5; - - IUniTaskAsyncEnumerator enumerator6; - UniTask.Awaiter awaiter6; - bool hasCurrent6; - bool running6; - T6 current6; - - IUniTaskAsyncEnumerator enumerator7; - UniTask.Awaiter awaiter7; - bool hasCurrent7; - bool running7; - T7 current7; - - IUniTaskAsyncEnumerator enumerator8; - UniTask.Awaiter awaiter8; - bool hasCurrent8; - bool running8; - T8 current8; - - IUniTaskAsyncEnumerator enumerator9; - UniTask.Awaiter awaiter9; - bool hasCurrent9; - bool running9; - T9 current9; - - IUniTaskAsyncEnumerator enumerator10; - UniTask.Awaiter awaiter10; - bool hasCurrent10; - bool running10; - T10 current10; - - IUniTaskAsyncEnumerator enumerator11; - UniTask.Awaiter awaiter11; - bool hasCurrent11; - bool running11; - T11 current11; - - IUniTaskAsyncEnumerator enumerator12; - UniTask.Awaiter awaiter12; - bool hasCurrent12; - bool running12; - T12 current12; - - IUniTaskAsyncEnumerator enumerator13; - UniTask.Awaiter awaiter13; - bool hasCurrent13; - bool running13; - T13 current13; - - IUniTaskAsyncEnumerator enumerator14; - UniTask.Awaiter awaiter14; - bool hasCurrent14; - bool running14; - T14 current14; - - int completedCount; - bool syncRunning; - TResult result; - - public _CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, IUniTaskAsyncEnumerable source10, IUniTaskAsyncEnumerable source11, IUniTaskAsyncEnumerable source12, IUniTaskAsyncEnumerable source13, IUniTaskAsyncEnumerable source14, Func resultSelector, CancellationToken cancellationToken) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - this.source7 = source7; - this.source8 = source8; - this.source9 = source9; - this.source10 = source10; - this.source11 = source11; - this.source12 = source12; - this.source13 = source13; - this.source14 = source14; - - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current => result; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - if (completedCount == CompleteCount) return CompletedTasks.False; - - if (enumerator1 == null) - { - enumerator1 = source1.GetAsyncEnumerator(cancellationToken); - enumerator2 = source2.GetAsyncEnumerator(cancellationToken); - enumerator3 = source3.GetAsyncEnumerator(cancellationToken); - enumerator4 = source4.GetAsyncEnumerator(cancellationToken); - enumerator5 = source5.GetAsyncEnumerator(cancellationToken); - enumerator6 = source6.GetAsyncEnumerator(cancellationToken); - enumerator7 = source7.GetAsyncEnumerator(cancellationToken); - enumerator8 = source8.GetAsyncEnumerator(cancellationToken); - enumerator9 = source9.GetAsyncEnumerator(cancellationToken); - enumerator10 = source10.GetAsyncEnumerator(cancellationToken); - enumerator11 = source11.GetAsyncEnumerator(cancellationToken); - enumerator12 = source12.GetAsyncEnumerator(cancellationToken); - enumerator13 = source13.GetAsyncEnumerator(cancellationToken); - enumerator14 = source14.GetAsyncEnumerator(cancellationToken); - } - - completionSource.Reset(); - - AGAIN: - syncRunning = true; - if (!running1) - { - running1 = true; - awaiter1 = enumerator1.MoveNextAsync().GetAwaiter(); - if (awaiter1.IsCompleted) - { - Completed1(this); - } - else - { - awaiter1.SourceOnCompleted(Completed1Delegate, this); - } - } - if (!running2) - { - running2 = true; - awaiter2 = enumerator2.MoveNextAsync().GetAwaiter(); - if (awaiter2.IsCompleted) - { - Completed2(this); - } - else - { - awaiter2.SourceOnCompleted(Completed2Delegate, this); - } - } - if (!running3) - { - running3 = true; - awaiter3 = enumerator3.MoveNextAsync().GetAwaiter(); - if (awaiter3.IsCompleted) - { - Completed3(this); - } - else - { - awaiter3.SourceOnCompleted(Completed3Delegate, this); - } - } - if (!running4) - { - running4 = true; - awaiter4 = enumerator4.MoveNextAsync().GetAwaiter(); - if (awaiter4.IsCompleted) - { - Completed4(this); - } - else - { - awaiter4.SourceOnCompleted(Completed4Delegate, this); - } - } - if (!running5) - { - running5 = true; - awaiter5 = enumerator5.MoveNextAsync().GetAwaiter(); - if (awaiter5.IsCompleted) - { - Completed5(this); - } - else - { - awaiter5.SourceOnCompleted(Completed5Delegate, this); - } - } - if (!running6) - { - running6 = true; - awaiter6 = enumerator6.MoveNextAsync().GetAwaiter(); - if (awaiter6.IsCompleted) - { - Completed6(this); - } - else - { - awaiter6.SourceOnCompleted(Completed6Delegate, this); - } - } - if (!running7) - { - running7 = true; - awaiter7 = enumerator7.MoveNextAsync().GetAwaiter(); - if (awaiter7.IsCompleted) - { - Completed7(this); - } - else - { - awaiter7.SourceOnCompleted(Completed7Delegate, this); - } - } - if (!running8) - { - running8 = true; - awaiter8 = enumerator8.MoveNextAsync().GetAwaiter(); - if (awaiter8.IsCompleted) - { - Completed8(this); - } - else - { - awaiter8.SourceOnCompleted(Completed8Delegate, this); - } - } - if (!running9) - { - running9 = true; - awaiter9 = enumerator9.MoveNextAsync().GetAwaiter(); - if (awaiter9.IsCompleted) - { - Completed9(this); - } - else - { - awaiter9.SourceOnCompleted(Completed9Delegate, this); - } - } - if (!running10) - { - running10 = true; - awaiter10 = enumerator10.MoveNextAsync().GetAwaiter(); - if (awaiter10.IsCompleted) - { - Completed10(this); - } - else - { - awaiter10.SourceOnCompleted(Completed10Delegate, this); - } - } - if (!running11) - { - running11 = true; - awaiter11 = enumerator11.MoveNextAsync().GetAwaiter(); - if (awaiter11.IsCompleted) - { - Completed11(this); - } - else - { - awaiter11.SourceOnCompleted(Completed11Delegate, this); - } - } - if (!running12) - { - running12 = true; - awaiter12 = enumerator12.MoveNextAsync().GetAwaiter(); - if (awaiter12.IsCompleted) - { - Completed12(this); - } - else - { - awaiter12.SourceOnCompleted(Completed12Delegate, this); - } - } - if (!running13) - { - running13 = true; - awaiter13 = enumerator13.MoveNextAsync().GetAwaiter(); - if (awaiter13.IsCompleted) - { - Completed13(this); - } - else - { - awaiter13.SourceOnCompleted(Completed13Delegate, this); - } - } - if (!running14) - { - running14 = true; - awaiter14 = enumerator14.MoveNextAsync().GetAwaiter(); - if (awaiter14.IsCompleted) - { - Completed14(this); - } - else - { - awaiter14.SourceOnCompleted(Completed14Delegate, this); - } - } - - if (!running1 || !running2 || !running3 || !running4 || !running5 || !running6 || !running7 || !running8 || !running9 || !running10 || !running11 || !running12 || !running13 || !running14) - { - goto AGAIN; - } - syncRunning = false; - - return new UniTask(this, completionSource.Version); - } - - static void Completed1(object state) - { - var self = (_CombineLatest)state; - self.running1 = false; - - try - { - if (self.awaiter1.GetResult()) - { - self.hasCurrent1 = true; - self.current1 = self.enumerator1.Current; - goto SUCCESS; - } - else - { - self.running1 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running1 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running1 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter1 = self.enumerator1.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter1.SourceOnCompleted(Completed1Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed2(object state) - { - var self = (_CombineLatest)state; - self.running2 = false; - - try - { - if (self.awaiter2.GetResult()) - { - self.hasCurrent2 = true; - self.current2 = self.enumerator2.Current; - goto SUCCESS; - } - else - { - self.running2 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running2 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running2 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter2 = self.enumerator2.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter2.SourceOnCompleted(Completed2Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed3(object state) - { - var self = (_CombineLatest)state; - self.running3 = false; - - try - { - if (self.awaiter3.GetResult()) - { - self.hasCurrent3 = true; - self.current3 = self.enumerator3.Current; - goto SUCCESS; - } - else - { - self.running3 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running3 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running3 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter3 = self.enumerator3.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter3.SourceOnCompleted(Completed3Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed4(object state) - { - var self = (_CombineLatest)state; - self.running4 = false; - - try - { - if (self.awaiter4.GetResult()) - { - self.hasCurrent4 = true; - self.current4 = self.enumerator4.Current; - goto SUCCESS; - } - else - { - self.running4 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running4 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running4 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter4 = self.enumerator4.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter4.SourceOnCompleted(Completed4Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed5(object state) - { - var self = (_CombineLatest)state; - self.running5 = false; - - try - { - if (self.awaiter5.GetResult()) - { - self.hasCurrent5 = true; - self.current5 = self.enumerator5.Current; - goto SUCCESS; - } - else - { - self.running5 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running5 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running5 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter5 = self.enumerator5.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter5.SourceOnCompleted(Completed5Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed6(object state) - { - var self = (_CombineLatest)state; - self.running6 = false; - - try - { - if (self.awaiter6.GetResult()) - { - self.hasCurrent6 = true; - self.current6 = self.enumerator6.Current; - goto SUCCESS; - } - else - { - self.running6 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running6 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running6 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter6 = self.enumerator6.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter6.SourceOnCompleted(Completed6Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed7(object state) - { - var self = (_CombineLatest)state; - self.running7 = false; - - try - { - if (self.awaiter7.GetResult()) - { - self.hasCurrent7 = true; - self.current7 = self.enumerator7.Current; - goto SUCCESS; - } - else - { - self.running7 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running7 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running7 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter7 = self.enumerator7.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter7.SourceOnCompleted(Completed7Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed8(object state) - { - var self = (_CombineLatest)state; - self.running8 = false; - - try - { - if (self.awaiter8.GetResult()) - { - self.hasCurrent8 = true; - self.current8 = self.enumerator8.Current; - goto SUCCESS; - } - else - { - self.running8 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running8 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running8 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter8 = self.enumerator8.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter8.SourceOnCompleted(Completed8Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed9(object state) - { - var self = (_CombineLatest)state; - self.running9 = false; - - try - { - if (self.awaiter9.GetResult()) - { - self.hasCurrent9 = true; - self.current9 = self.enumerator9.Current; - goto SUCCESS; - } - else - { - self.running9 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running9 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running9 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter9 = self.enumerator9.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter9.SourceOnCompleted(Completed9Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed10(object state) - { - var self = (_CombineLatest)state; - self.running10 = false; - - try - { - if (self.awaiter10.GetResult()) - { - self.hasCurrent10 = true; - self.current10 = self.enumerator10.Current; - goto SUCCESS; - } - else - { - self.running10 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running10 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running10 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter10 = self.enumerator10.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter10.SourceOnCompleted(Completed10Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed11(object state) - { - var self = (_CombineLatest)state; - self.running11 = false; - - try - { - if (self.awaiter11.GetResult()) - { - self.hasCurrent11 = true; - self.current11 = self.enumerator11.Current; - goto SUCCESS; - } - else - { - self.running11 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running11 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running11 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter11 = self.enumerator11.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter11.SourceOnCompleted(Completed11Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed12(object state) - { - var self = (_CombineLatest)state; - self.running12 = false; - - try - { - if (self.awaiter12.GetResult()) - { - self.hasCurrent12 = true; - self.current12 = self.enumerator12.Current; - goto SUCCESS; - } - else - { - self.running12 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running12 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running12 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter12 = self.enumerator12.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter12.SourceOnCompleted(Completed12Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed13(object state) - { - var self = (_CombineLatest)state; - self.running13 = false; - - try - { - if (self.awaiter13.GetResult()) - { - self.hasCurrent13 = true; - self.current13 = self.enumerator13.Current; - goto SUCCESS; - } - else - { - self.running13 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running13 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running13 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter13 = self.enumerator13.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter13.SourceOnCompleted(Completed13Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed14(object state) - { - var self = (_CombineLatest)state; - self.running14 = false; - - try - { - if (self.awaiter14.GetResult()) - { - self.hasCurrent14 = true; - self.current14 = self.enumerator14.Current; - goto SUCCESS; - } - else - { - self.running14 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running14 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running14 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter14 = self.enumerator14.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter14.SourceOnCompleted(Completed14Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - bool TrySetResult() - { - if (hasCurrent1 && hasCurrent2 && hasCurrent3 && hasCurrent4 && hasCurrent5 && hasCurrent6 && hasCurrent7 && hasCurrent8 && hasCurrent9 && hasCurrent10 && hasCurrent11 && hasCurrent12 && hasCurrent13 && hasCurrent14) - { - result = resultSelector(current1, current2, current3, current4, current5, current6, current7, current8, current9, current10, current11, current12, current13, current14); - completionSource.TrySetResult(true); - return true; - } - else - { - return false; - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator1 != null) - { - await enumerator1.DisposeAsync(); - } - if (enumerator2 != null) - { - await enumerator2.DisposeAsync(); - } - if (enumerator3 != null) - { - await enumerator3.DisposeAsync(); - } - if (enumerator4 != null) - { - await enumerator4.DisposeAsync(); - } - if (enumerator5 != null) - { - await enumerator5.DisposeAsync(); - } - if (enumerator6 != null) - { - await enumerator6.DisposeAsync(); - } - if (enumerator7 != null) - { - await enumerator7.DisposeAsync(); - } - if (enumerator8 != null) - { - await enumerator8.DisposeAsync(); - } - if (enumerator9 != null) - { - await enumerator9.DisposeAsync(); - } - if (enumerator10 != null) - { - await enumerator10.DisposeAsync(); - } - if (enumerator11 != null) - { - await enumerator11.DisposeAsync(); - } - if (enumerator12 != null) - { - await enumerator12.DisposeAsync(); - } - if (enumerator13 != null) - { - await enumerator13.DisposeAsync(); - } - if (enumerator14 != null) - { - await enumerator14.DisposeAsync(); - } - } - } - } - - internal class CombineLatest : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - readonly IUniTaskAsyncEnumerable source7; - readonly IUniTaskAsyncEnumerable source8; - readonly IUniTaskAsyncEnumerable source9; - readonly IUniTaskAsyncEnumerable source10; - readonly IUniTaskAsyncEnumerable source11; - readonly IUniTaskAsyncEnumerable source12; - readonly IUniTaskAsyncEnumerable source13; - readonly IUniTaskAsyncEnumerable source14; - readonly IUniTaskAsyncEnumerable source15; - - readonly Func resultSelector; - - public CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, IUniTaskAsyncEnumerable source10, IUniTaskAsyncEnumerable source11, IUniTaskAsyncEnumerable source12, IUniTaskAsyncEnumerable source13, IUniTaskAsyncEnumerable source14, IUniTaskAsyncEnumerable source15, Func resultSelector) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - this.source7 = source7; - this.source8 = source8; - this.source9 = source9; - this.source10 = source10; - this.source11 = source11; - this.source12 = source12; - this.source13 = source13; - this.source14 = source14; - this.source15 = source15; - - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _CombineLatest(source1, source2, source3, source4, source5, source6, source7, source8, source9, source10, source11, source12, source13, source14, source15, resultSelector, cancellationToken); - } - - class _CombineLatest : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action Completed1Delegate = Completed1; - static readonly Action Completed2Delegate = Completed2; - static readonly Action Completed3Delegate = Completed3; - static readonly Action Completed4Delegate = Completed4; - static readonly Action Completed5Delegate = Completed5; - static readonly Action Completed6Delegate = Completed6; - static readonly Action Completed7Delegate = Completed7; - static readonly Action Completed8Delegate = Completed8; - static readonly Action Completed9Delegate = Completed9; - static readonly Action Completed10Delegate = Completed10; - static readonly Action Completed11Delegate = Completed11; - static readonly Action Completed12Delegate = Completed12; - static readonly Action Completed13Delegate = Completed13; - static readonly Action Completed14Delegate = Completed14; - static readonly Action Completed15Delegate = Completed15; - const int CompleteCount = 15; - - readonly IUniTaskAsyncEnumerable source1; - readonly IUniTaskAsyncEnumerable source2; - readonly IUniTaskAsyncEnumerable source3; - readonly IUniTaskAsyncEnumerable source4; - readonly IUniTaskAsyncEnumerable source5; - readonly IUniTaskAsyncEnumerable source6; - readonly IUniTaskAsyncEnumerable source7; - readonly IUniTaskAsyncEnumerable source8; - readonly IUniTaskAsyncEnumerable source9; - readonly IUniTaskAsyncEnumerable source10; - readonly IUniTaskAsyncEnumerable source11; - readonly IUniTaskAsyncEnumerable source12; - readonly IUniTaskAsyncEnumerable source13; - readonly IUniTaskAsyncEnumerable source14; - readonly IUniTaskAsyncEnumerable source15; - - readonly Func resultSelector; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator1; - UniTask.Awaiter awaiter1; - bool hasCurrent1; - bool running1; - T1 current1; - - IUniTaskAsyncEnumerator enumerator2; - UniTask.Awaiter awaiter2; - bool hasCurrent2; - bool running2; - T2 current2; - - IUniTaskAsyncEnumerator enumerator3; - UniTask.Awaiter awaiter3; - bool hasCurrent3; - bool running3; - T3 current3; - - IUniTaskAsyncEnumerator enumerator4; - UniTask.Awaiter awaiter4; - bool hasCurrent4; - bool running4; - T4 current4; - - IUniTaskAsyncEnumerator enumerator5; - UniTask.Awaiter awaiter5; - bool hasCurrent5; - bool running5; - T5 current5; - - IUniTaskAsyncEnumerator enumerator6; - UniTask.Awaiter awaiter6; - bool hasCurrent6; - bool running6; - T6 current6; - - IUniTaskAsyncEnumerator enumerator7; - UniTask.Awaiter awaiter7; - bool hasCurrent7; - bool running7; - T7 current7; - - IUniTaskAsyncEnumerator enumerator8; - UniTask.Awaiter awaiter8; - bool hasCurrent8; - bool running8; - T8 current8; - - IUniTaskAsyncEnumerator enumerator9; - UniTask.Awaiter awaiter9; - bool hasCurrent9; - bool running9; - T9 current9; - - IUniTaskAsyncEnumerator enumerator10; - UniTask.Awaiter awaiter10; - bool hasCurrent10; - bool running10; - T10 current10; - - IUniTaskAsyncEnumerator enumerator11; - UniTask.Awaiter awaiter11; - bool hasCurrent11; - bool running11; - T11 current11; - - IUniTaskAsyncEnumerator enumerator12; - UniTask.Awaiter awaiter12; - bool hasCurrent12; - bool running12; - T12 current12; - - IUniTaskAsyncEnumerator enumerator13; - UniTask.Awaiter awaiter13; - bool hasCurrent13; - bool running13; - T13 current13; - - IUniTaskAsyncEnumerator enumerator14; - UniTask.Awaiter awaiter14; - bool hasCurrent14; - bool running14; - T14 current14; - - IUniTaskAsyncEnumerator enumerator15; - UniTask.Awaiter awaiter15; - bool hasCurrent15; - bool running15; - T15 current15; - - int completedCount; - bool syncRunning; - TResult result; - - public _CombineLatest(IUniTaskAsyncEnumerable source1, IUniTaskAsyncEnumerable source2, IUniTaskAsyncEnumerable source3, IUniTaskAsyncEnumerable source4, IUniTaskAsyncEnumerable source5, IUniTaskAsyncEnumerable source6, IUniTaskAsyncEnumerable source7, IUniTaskAsyncEnumerable source8, IUniTaskAsyncEnumerable source9, IUniTaskAsyncEnumerable source10, IUniTaskAsyncEnumerable source11, IUniTaskAsyncEnumerable source12, IUniTaskAsyncEnumerable source13, IUniTaskAsyncEnumerable source14, IUniTaskAsyncEnumerable source15, Func resultSelector, CancellationToken cancellationToken) - { - this.source1 = source1; - this.source2 = source2; - this.source3 = source3; - this.source4 = source4; - this.source5 = source5; - this.source6 = source6; - this.source7 = source7; - this.source8 = source8; - this.source9 = source9; - this.source10 = source10; - this.source11 = source11; - this.source12 = source12; - this.source13 = source13; - this.source14 = source14; - this.source15 = source15; - - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current => result; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - if (completedCount == CompleteCount) return CompletedTasks.False; - - if (enumerator1 == null) - { - enumerator1 = source1.GetAsyncEnumerator(cancellationToken); - enumerator2 = source2.GetAsyncEnumerator(cancellationToken); - enumerator3 = source3.GetAsyncEnumerator(cancellationToken); - enumerator4 = source4.GetAsyncEnumerator(cancellationToken); - enumerator5 = source5.GetAsyncEnumerator(cancellationToken); - enumerator6 = source6.GetAsyncEnumerator(cancellationToken); - enumerator7 = source7.GetAsyncEnumerator(cancellationToken); - enumerator8 = source8.GetAsyncEnumerator(cancellationToken); - enumerator9 = source9.GetAsyncEnumerator(cancellationToken); - enumerator10 = source10.GetAsyncEnumerator(cancellationToken); - enumerator11 = source11.GetAsyncEnumerator(cancellationToken); - enumerator12 = source12.GetAsyncEnumerator(cancellationToken); - enumerator13 = source13.GetAsyncEnumerator(cancellationToken); - enumerator14 = source14.GetAsyncEnumerator(cancellationToken); - enumerator15 = source15.GetAsyncEnumerator(cancellationToken); - } - - completionSource.Reset(); - - AGAIN: - syncRunning = true; - if (!running1) - { - running1 = true; - awaiter1 = enumerator1.MoveNextAsync().GetAwaiter(); - if (awaiter1.IsCompleted) - { - Completed1(this); - } - else - { - awaiter1.SourceOnCompleted(Completed1Delegate, this); - } - } - if (!running2) - { - running2 = true; - awaiter2 = enumerator2.MoveNextAsync().GetAwaiter(); - if (awaiter2.IsCompleted) - { - Completed2(this); - } - else - { - awaiter2.SourceOnCompleted(Completed2Delegate, this); - } - } - if (!running3) - { - running3 = true; - awaiter3 = enumerator3.MoveNextAsync().GetAwaiter(); - if (awaiter3.IsCompleted) - { - Completed3(this); - } - else - { - awaiter3.SourceOnCompleted(Completed3Delegate, this); - } - } - if (!running4) - { - running4 = true; - awaiter4 = enumerator4.MoveNextAsync().GetAwaiter(); - if (awaiter4.IsCompleted) - { - Completed4(this); - } - else - { - awaiter4.SourceOnCompleted(Completed4Delegate, this); - } - } - if (!running5) - { - running5 = true; - awaiter5 = enumerator5.MoveNextAsync().GetAwaiter(); - if (awaiter5.IsCompleted) - { - Completed5(this); - } - else - { - awaiter5.SourceOnCompleted(Completed5Delegate, this); - } - } - if (!running6) - { - running6 = true; - awaiter6 = enumerator6.MoveNextAsync().GetAwaiter(); - if (awaiter6.IsCompleted) - { - Completed6(this); - } - else - { - awaiter6.SourceOnCompleted(Completed6Delegate, this); - } - } - if (!running7) - { - running7 = true; - awaiter7 = enumerator7.MoveNextAsync().GetAwaiter(); - if (awaiter7.IsCompleted) - { - Completed7(this); - } - else - { - awaiter7.SourceOnCompleted(Completed7Delegate, this); - } - } - if (!running8) - { - running8 = true; - awaiter8 = enumerator8.MoveNextAsync().GetAwaiter(); - if (awaiter8.IsCompleted) - { - Completed8(this); - } - else - { - awaiter8.SourceOnCompleted(Completed8Delegate, this); - } - } - if (!running9) - { - running9 = true; - awaiter9 = enumerator9.MoveNextAsync().GetAwaiter(); - if (awaiter9.IsCompleted) - { - Completed9(this); - } - else - { - awaiter9.SourceOnCompleted(Completed9Delegate, this); - } - } - if (!running10) - { - running10 = true; - awaiter10 = enumerator10.MoveNextAsync().GetAwaiter(); - if (awaiter10.IsCompleted) - { - Completed10(this); - } - else - { - awaiter10.SourceOnCompleted(Completed10Delegate, this); - } - } - if (!running11) - { - running11 = true; - awaiter11 = enumerator11.MoveNextAsync().GetAwaiter(); - if (awaiter11.IsCompleted) - { - Completed11(this); - } - else - { - awaiter11.SourceOnCompleted(Completed11Delegate, this); - } - } - if (!running12) - { - running12 = true; - awaiter12 = enumerator12.MoveNextAsync().GetAwaiter(); - if (awaiter12.IsCompleted) - { - Completed12(this); - } - else - { - awaiter12.SourceOnCompleted(Completed12Delegate, this); - } - } - if (!running13) - { - running13 = true; - awaiter13 = enumerator13.MoveNextAsync().GetAwaiter(); - if (awaiter13.IsCompleted) - { - Completed13(this); - } - else - { - awaiter13.SourceOnCompleted(Completed13Delegate, this); - } - } - if (!running14) - { - running14 = true; - awaiter14 = enumerator14.MoveNextAsync().GetAwaiter(); - if (awaiter14.IsCompleted) - { - Completed14(this); - } - else - { - awaiter14.SourceOnCompleted(Completed14Delegate, this); - } - } - if (!running15) - { - running15 = true; - awaiter15 = enumerator15.MoveNextAsync().GetAwaiter(); - if (awaiter15.IsCompleted) - { - Completed15(this); - } - else - { - awaiter15.SourceOnCompleted(Completed15Delegate, this); - } - } - - if (!running1 || !running2 || !running3 || !running4 || !running5 || !running6 || !running7 || !running8 || !running9 || !running10 || !running11 || !running12 || !running13 || !running14 || !running15) - { - goto AGAIN; - } - syncRunning = false; - - return new UniTask(this, completionSource.Version); - } - - static void Completed1(object state) - { - var self = (_CombineLatest)state; - self.running1 = false; - - try - { - if (self.awaiter1.GetResult()) - { - self.hasCurrent1 = true; - self.current1 = self.enumerator1.Current; - goto SUCCESS; - } - else - { - self.running1 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running1 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running1 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter1 = self.enumerator1.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter1.SourceOnCompleted(Completed1Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed2(object state) - { - var self = (_CombineLatest)state; - self.running2 = false; - - try - { - if (self.awaiter2.GetResult()) - { - self.hasCurrent2 = true; - self.current2 = self.enumerator2.Current; - goto SUCCESS; - } - else - { - self.running2 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running2 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running2 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter2 = self.enumerator2.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter2.SourceOnCompleted(Completed2Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed3(object state) - { - var self = (_CombineLatest)state; - self.running3 = false; - - try - { - if (self.awaiter3.GetResult()) - { - self.hasCurrent3 = true; - self.current3 = self.enumerator3.Current; - goto SUCCESS; - } - else - { - self.running3 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running3 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running3 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter3 = self.enumerator3.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter3.SourceOnCompleted(Completed3Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed4(object state) - { - var self = (_CombineLatest)state; - self.running4 = false; - - try - { - if (self.awaiter4.GetResult()) - { - self.hasCurrent4 = true; - self.current4 = self.enumerator4.Current; - goto SUCCESS; - } - else - { - self.running4 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running4 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running4 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter4 = self.enumerator4.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter4.SourceOnCompleted(Completed4Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed5(object state) - { - var self = (_CombineLatest)state; - self.running5 = false; - - try - { - if (self.awaiter5.GetResult()) - { - self.hasCurrent5 = true; - self.current5 = self.enumerator5.Current; - goto SUCCESS; - } - else - { - self.running5 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running5 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running5 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter5 = self.enumerator5.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter5.SourceOnCompleted(Completed5Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed6(object state) - { - var self = (_CombineLatest)state; - self.running6 = false; - - try - { - if (self.awaiter6.GetResult()) - { - self.hasCurrent6 = true; - self.current6 = self.enumerator6.Current; - goto SUCCESS; - } - else - { - self.running6 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running6 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running6 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter6 = self.enumerator6.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter6.SourceOnCompleted(Completed6Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed7(object state) - { - var self = (_CombineLatest)state; - self.running7 = false; - - try - { - if (self.awaiter7.GetResult()) - { - self.hasCurrent7 = true; - self.current7 = self.enumerator7.Current; - goto SUCCESS; - } - else - { - self.running7 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running7 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running7 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter7 = self.enumerator7.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter7.SourceOnCompleted(Completed7Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed8(object state) - { - var self = (_CombineLatest)state; - self.running8 = false; - - try - { - if (self.awaiter8.GetResult()) - { - self.hasCurrent8 = true; - self.current8 = self.enumerator8.Current; - goto SUCCESS; - } - else - { - self.running8 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running8 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running8 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter8 = self.enumerator8.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter8.SourceOnCompleted(Completed8Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed9(object state) - { - var self = (_CombineLatest)state; - self.running9 = false; - - try - { - if (self.awaiter9.GetResult()) - { - self.hasCurrent9 = true; - self.current9 = self.enumerator9.Current; - goto SUCCESS; - } - else - { - self.running9 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running9 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running9 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter9 = self.enumerator9.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter9.SourceOnCompleted(Completed9Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed10(object state) - { - var self = (_CombineLatest)state; - self.running10 = false; - - try - { - if (self.awaiter10.GetResult()) - { - self.hasCurrent10 = true; - self.current10 = self.enumerator10.Current; - goto SUCCESS; - } - else - { - self.running10 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running10 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running10 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter10 = self.enumerator10.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter10.SourceOnCompleted(Completed10Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed11(object state) - { - var self = (_CombineLatest)state; - self.running11 = false; - - try - { - if (self.awaiter11.GetResult()) - { - self.hasCurrent11 = true; - self.current11 = self.enumerator11.Current; - goto SUCCESS; - } - else - { - self.running11 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running11 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running11 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter11 = self.enumerator11.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter11.SourceOnCompleted(Completed11Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed12(object state) - { - var self = (_CombineLatest)state; - self.running12 = false; - - try - { - if (self.awaiter12.GetResult()) - { - self.hasCurrent12 = true; - self.current12 = self.enumerator12.Current; - goto SUCCESS; - } - else - { - self.running12 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running12 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running12 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter12 = self.enumerator12.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter12.SourceOnCompleted(Completed12Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed13(object state) - { - var self = (_CombineLatest)state; - self.running13 = false; - - try - { - if (self.awaiter13.GetResult()) - { - self.hasCurrent13 = true; - self.current13 = self.enumerator13.Current; - goto SUCCESS; - } - else - { - self.running13 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running13 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running13 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter13 = self.enumerator13.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter13.SourceOnCompleted(Completed13Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed14(object state) - { - var self = (_CombineLatest)state; - self.running14 = false; - - try - { - if (self.awaiter14.GetResult()) - { - self.hasCurrent14 = true; - self.current14 = self.enumerator14.Current; - goto SUCCESS; - } - else - { - self.running14 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running14 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running14 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter14 = self.enumerator14.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter14.SourceOnCompleted(Completed14Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - static void Completed15(object state) - { - var self = (_CombineLatest)state; - self.running15 = false; - - try - { - if (self.awaiter15.GetResult()) - { - self.hasCurrent15 = true; - self.current15 = self.enumerator15.Current; - goto SUCCESS; - } - else - { - self.running15 = true; // as complete, no more call MoveNextAsync. - if (Interlocked.Increment(ref self.completedCount) == CompleteCount) - { - goto COMPLETE; - } - return; - } - } - catch (Exception ex) - { - self.running15 = true; // as complete, no more call MoveNextAsync. - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - SUCCESS: - if (!self.TrySetResult()) - { - if (self.syncRunning) return; - self.running15 = true; // as complete, no more call MoveNextAsync. - try - { - self.awaiter15 = self.enumerator15.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completedCount = CompleteCount; - self.completionSource.TrySetException(ex); - return; - } - - self.awaiter15.SourceOnCompleted(Completed15Delegate, self); - } - return; - COMPLETE: - self.completionSource.TrySetResult(false); - return; - } - - bool TrySetResult() - { - if (hasCurrent1 && hasCurrent2 && hasCurrent3 && hasCurrent4 && hasCurrent5 && hasCurrent6 && hasCurrent7 && hasCurrent8 && hasCurrent9 && hasCurrent10 && hasCurrent11 && hasCurrent12 && hasCurrent13 && hasCurrent14 && hasCurrent15) - { - result = resultSelector(current1, current2, current3, current4, current5, current6, current7, current8, current9, current10, current11, current12, current13, current14, current15); - completionSource.TrySetResult(true); - return true; - } - else - { - return false; - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator1 != null) - { - await enumerator1.DisposeAsync(); - } - if (enumerator2 != null) - { - await enumerator2.DisposeAsync(); - } - if (enumerator3 != null) - { - await enumerator3.DisposeAsync(); - } - if (enumerator4 != null) - { - await enumerator4.DisposeAsync(); - } - if (enumerator5 != null) - { - await enumerator5.DisposeAsync(); - } - if (enumerator6 != null) - { - await enumerator6.DisposeAsync(); - } - if (enumerator7 != null) - { - await enumerator7.DisposeAsync(); - } - if (enumerator8 != null) - { - await enumerator8.DisposeAsync(); - } - if (enumerator9 != null) - { - await enumerator9.DisposeAsync(); - } - if (enumerator10 != null) - { - await enumerator10.DisposeAsync(); - } - if (enumerator11 != null) - { - await enumerator11.DisposeAsync(); - } - if (enumerator12 != null) - { - await enumerator12.DisposeAsync(); - } - if (enumerator13 != null) - { - await enumerator13.DisposeAsync(); - } - if (enumerator14 != null) - { - await enumerator14.DisposeAsync(); - } - if (enumerator15 != null) - { - await enumerator15.DisposeAsync(); - } - } - } - } - -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/CombineLatest.cs.meta b/VirtueSky/UniTask/Runtime/Linq/CombineLatest.cs.meta deleted file mode 100644 index 4e8b1c34..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/CombineLatest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6cb07f6e88287e34d9b9301a572284a5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Concat.cs b/VirtueSky/UniTask/Runtime/Linq/Concat.cs deleted file mode 100644 index 992b0278..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Concat.cs +++ /dev/null @@ -1,164 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Concat(this IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second) - { - Error.ThrowArgumentNullException(first, nameof(first)); - Error.ThrowArgumentNullException(second, nameof(second)); - - return new Concat(first, second); - } - } - - internal sealed class Concat : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable first; - readonly IUniTaskAsyncEnumerable second; - - public Concat(IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second) - { - this.first = first; - this.second = second; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Concat(first, second, cancellationToken); - } - - sealed class _Concat : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action MoveNextCoreDelegate = MoveNextCore; - - enum IteratingState - { - IteratingFirst, - IteratingSecond, - Complete - } - - readonly IUniTaskAsyncEnumerable first; - readonly IUniTaskAsyncEnumerable second; - CancellationToken cancellationToken; - - IteratingState iteratingState; - - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - - public _Concat(IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, CancellationToken cancellationToken) - { - this.first = first; - this.second = second; - this.cancellationToken = cancellationToken; - this.iteratingState = IteratingState.IteratingFirst; - TaskTracker.TrackActiveTask(this, 3); - } - - public TSource Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - - if (iteratingState == IteratingState.Complete) return CompletedTasks.False; - - completionSource.Reset(); - StartIterate(); - return new UniTask(this, completionSource.Version); - } - - void StartIterate() - { - if (enumerator == null) - { - if (iteratingState == IteratingState.IteratingFirst) - { - enumerator = first.GetAsyncEnumerator(cancellationToken); - } - else if (iteratingState == IteratingState.IteratingSecond) - { - enumerator = second.GetAsyncEnumerator(cancellationToken); - } - } - - try - { - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - - if (awaiter.IsCompleted) - { - MoveNextCoreDelegate(this); - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - } - - static void MoveNextCore(object state) - { - var self = (_Concat)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - self.Current = self.enumerator.Current; - self.completionSource.TrySetResult(true); - } - else - { - if (self.iteratingState == IteratingState.IteratingFirst) - { - self.RunSecondAfterDisposeAsync().Forget(); - return; - } - - self.iteratingState = IteratingState.Complete; - self.completionSource.TrySetResult(false); - } - } - } - - async UniTaskVoid RunSecondAfterDisposeAsync() - { - try - { - await enumerator.DisposeAsync(); - enumerator = null; - awaiter = default; - iteratingState = IteratingState.IteratingSecond; - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - - StartIterate(); - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Concat.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Concat.cs.meta deleted file mode 100644 index 6bfcf318..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Concat.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7cb9e19c449127a459851a135ce7d527 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Contains.cs b/VirtueSky/UniTask/Runtime/Linq/Contains.cs deleted file mode 100644 index a6166a4e..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Contains.cs +++ /dev/null @@ -1,50 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask ContainsAsync(this IUniTaskAsyncEnumerable source, TSource value, CancellationToken cancellationToken = default) - { - return ContainsAsync(source, value, EqualityComparer.Default, cancellationToken); - } - - public static UniTask ContainsAsync(this IUniTaskAsyncEnumerable source, TSource value, IEqualityComparer comparer, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return Contains.ContainsAsync(source, value, comparer, cancellationToken); - } - } - - internal static class Contains - { - internal static async UniTask ContainsAsync(IUniTaskAsyncEnumerable source, TSource value, IEqualityComparer comparer, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - if (comparer.Equals(value, e.Current)) - { - return true; - } - } - - return false; - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Contains.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Contains.cs.meta deleted file mode 100644 index 9bd414b3..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Contains.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 36ab06d30f3223048b4f676e05431a7f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Count.cs b/VirtueSky/UniTask/Runtime/Linq/Count.cs deleted file mode 100644 index a27f430a..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Count.cs +++ /dev/null @@ -1,144 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask CountAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Count.CountAsync(source, cancellationToken); - } - - public static UniTask CountAsync(this IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return Count.CountAsync(source, predicate, cancellationToken); - } - - public static UniTask CountAwaitAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return Count.CountAwaitAsync(source, predicate, cancellationToken); - } - - public static UniTask CountAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return Count.CountAwaitWithCancellationAsync(source, predicate, cancellationToken); - } - } - - internal static class Count - { - internal static async UniTask CountAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - var count = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked { count++; } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return count; - } - - internal static async UniTask CountAsync(IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken) - { - var count = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - if (predicate(e.Current)) - { - checked { count++; } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return count; - } - - internal static async UniTask CountAwaitAsync(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - { - var count = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - if (await predicate(e.Current)) - { - checked { count++; } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return count; - } - - internal static async UniTask CountAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - { - var count = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - if (await predicate(e.Current, cancellationToken)) - { - checked { count++; } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return count; - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Count.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Count.cs.meta deleted file mode 100644 index 35db3324..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Count.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e606d38eed688574bb2ba89d983cc9bb -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Create.cs b/VirtueSky/UniTask/Runtime/Linq/Create.cs deleted file mode 100644 index 8174406b..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Create.cs +++ /dev/null @@ -1,184 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Create(Func, CancellationToken, UniTask> create) - { - Error.ThrowArgumentNullException(create, nameof(create)); - return new Create(create); - } - } - - public interface IAsyncWriter - { - UniTask YieldAsync(T value); - } - - internal sealed class Create : IUniTaskAsyncEnumerable - { - readonly Func, CancellationToken, UniTask> create; - - public Create(Func, CancellationToken, UniTask> create) - { - this.create = create; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Create(create, cancellationToken); - } - - sealed class _Create : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly Func, CancellationToken, UniTask> create; - readonly CancellationToken cancellationToken; - - int state = -1; - AsyncWriter writer; - - public _Create(Func, CancellationToken, UniTask> create, CancellationToken cancellationToken) - { - this.create = create; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public T Current { get; private set; } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - writer.Dispose(); - return default; - } - - public UniTask MoveNextAsync() - { - if (state == -2) return default; - - completionSource.Reset(); - MoveNext(); - return new UniTask(this, completionSource.Version); - } - - void MoveNext() - { - try - { - switch (state) - { - case -1: // init - { - writer = new AsyncWriter(this); - RunWriterTask(create(writer, cancellationToken)).Forget(); - if (Volatile.Read(ref state) == -2) - { - return; // complete synchronously - } - state = 0; // wait YieldAsync, it set TrySetResult(true) - return; - } - case 0: - writer.SignalWriter(); - return; - default: - goto DONE; - } - } - catch (Exception ex) - { - state = -2; - completionSource.TrySetException(ex); - return; - } - - DONE: - state = -2; - completionSource.TrySetResult(false); - return; - } - - async UniTaskVoid RunWriterTask(UniTask task) - { - try - { - await task; - goto DONE; - } - catch (Exception ex) - { - Volatile.Write(ref state, -2); - completionSource.TrySetException(ex); - return; - } - - DONE: - Volatile.Write(ref state, -2); - completionSource.TrySetResult(false); - } - - public void SetResult(T value) - { - Current = value; - completionSource.TrySetResult(true); - } - } - - sealed class AsyncWriter : IUniTaskSource, IAsyncWriter, IDisposable - { - readonly _Create enumerator; - - UniTaskCompletionSourceCore core; - - public AsyncWriter(_Create enumerator) - { - this.enumerator = enumerator; - } - - public void Dispose() - { - var status = core.GetStatus(core.Version); - if (status == UniTaskStatus.Pending) - { - core.TrySetCanceled(); - } - } - - public void GetResult(short token) - { - core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTask YieldAsync(T value) - { - core.Reset(); - enumerator.SetResult(value); - return new UniTask(this, core.Version); - } - - public void SignalWriter() - { - core.TrySetResult(AsyncUnit.Default); - } - } - } -} diff --git a/VirtueSky/UniTask/Runtime/Linq/Create.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Create.cs.meta deleted file mode 100644 index 5aba456f..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Create.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0202f723469f93945afa063bfb440d15 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/DefaultIfEmpty.cs b/VirtueSky/UniTask/Runtime/Linq/DefaultIfEmpty.cs deleted file mode 100644 index 8221d1c7..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/DefaultIfEmpty.cs +++ /dev/null @@ -1,142 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable DefaultIfEmpty(this IUniTaskAsyncEnumerable source) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return new DefaultIfEmpty(source, default); - } - - public static IUniTaskAsyncEnumerable DefaultIfEmpty(this IUniTaskAsyncEnumerable source, TSource defaultValue) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return new DefaultIfEmpty(source, defaultValue); - } - } - - internal sealed class DefaultIfEmpty : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly TSource defaultValue; - - public DefaultIfEmpty(IUniTaskAsyncEnumerable source, TSource defaultValue) - { - this.source = source; - this.defaultValue = defaultValue; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _DefaultIfEmpty(source, defaultValue, cancellationToken); - } - - sealed class _DefaultIfEmpty : MoveNextSource, IUniTaskAsyncEnumerator - { - enum IteratingState : byte - { - Empty, - Iterating, - Completed - } - - static readonly Action MoveNextCoreDelegate = MoveNextCore; - - readonly IUniTaskAsyncEnumerable source; - readonly TSource defaultValue; - CancellationToken cancellationToken; - - IteratingState iteratingState; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - - public _DefaultIfEmpty(IUniTaskAsyncEnumerable source, TSource defaultValue, CancellationToken cancellationToken) - { - this.source = source; - this.defaultValue = defaultValue; - this.cancellationToken = cancellationToken; - - this.iteratingState = IteratingState.Empty; - TaskTracker.TrackActiveTask(this, 3); - } - - public TSource Current { get; private set; } - - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - completionSource.Reset(); - - if (iteratingState == IteratingState.Completed) - { - return CompletedTasks.False; - } - - if (enumerator == null) - { - enumerator = source.GetAsyncEnumerator(cancellationToken); - } - - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - - if (awaiter.IsCompleted) - { - MoveNextCore(this); - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - - return new UniTask(this, completionSource.Version); - } - - static void MoveNextCore(object state) - { - var self = (_DefaultIfEmpty)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - self.iteratingState = IteratingState.Iterating; - self.Current = self.enumerator.Current; - self.completionSource.TrySetResult(true); - } - else - { - if (self.iteratingState == IteratingState.Empty) - { - self.iteratingState = IteratingState.Completed; - - self.Current = self.defaultValue; - self.completionSource.TrySetResult(true); - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - return default; - } - } - } - -} diff --git a/VirtueSky/UniTask/Runtime/Linq/DefaultIfEmpty.cs.meta b/VirtueSky/UniTask/Runtime/Linq/DefaultIfEmpty.cs.meta deleted file mode 100644 index 5aa59939..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/DefaultIfEmpty.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 19e437c039ad7e1478dbce1779ef8660 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Distinct.cs b/VirtueSky/UniTask/Runtime/Linq/Distinct.cs deleted file mode 100644 index d224021b..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Distinct.cs +++ /dev/null @@ -1,277 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Distinct(this IUniTaskAsyncEnumerable source) - { - return Distinct(source, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable Distinct(this IUniTaskAsyncEnumerable source, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new Distinct(source, comparer); - } - - public static IUniTaskAsyncEnumerable Distinct(this IUniTaskAsyncEnumerable source, Func keySelector) - { - return Distinct(source, keySelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable Distinct(this IUniTaskAsyncEnumerable source, Func keySelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new Distinct(source, keySelector, comparer); - } - - public static IUniTaskAsyncEnumerable DistinctAwait(this IUniTaskAsyncEnumerable source, Func> keySelector) - { - return DistinctAwait(source, keySelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable DistinctAwait(this IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new DistinctAwait(source, keySelector, comparer); - } - - public static IUniTaskAsyncEnumerable DistinctAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> keySelector) - { - return DistinctAwaitWithCancellation(source, keySelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable DistinctAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new DistinctAwaitWithCancellation(source, keySelector, comparer); - } - } - - internal sealed class Distinct : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly IEqualityComparer comparer; - - public Distinct(IUniTaskAsyncEnumerable source, IEqualityComparer comparer) - { - this.source = source; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Distinct(source, comparer, cancellationToken); - } - - class _Distinct : AsyncEnumeratorBase - { - readonly HashSet set; - - public _Distinct(IUniTaskAsyncEnumerable source, IEqualityComparer comparer, CancellationToken cancellationToken) - - : base(source, cancellationToken) - { - this.set = new HashSet(comparer); - } - - protected override bool TryMoveNextCore(bool sourceHasCurrent, out bool result) - { - if (sourceHasCurrent) - { - var v = SourceCurrent; - if (set.Add(v)) - { - Current = v; - result = true; - return true; - } - else - { - result = default; - return false; - } - } - - result = false; - return true; - } - } - } - - internal sealed class Distinct : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func keySelector; - readonly IEqualityComparer comparer; - - public Distinct(IUniTaskAsyncEnumerable source, Func keySelector, IEqualityComparer comparer) - { - this.source = source; - this.keySelector = keySelector; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Distinct(source, keySelector, comparer, cancellationToken); - } - - class _Distinct : AsyncEnumeratorBase - { - readonly HashSet set; - readonly Func keySelector; - - public _Distinct(IUniTaskAsyncEnumerable source, Func keySelector, IEqualityComparer comparer, CancellationToken cancellationToken) - - : base(source, cancellationToken) - { - this.set = new HashSet(comparer); - this.keySelector = keySelector; - } - - protected override bool TryMoveNextCore(bool sourceHasCurrent, out bool result) - { - if (sourceHasCurrent) - { - var v = SourceCurrent; - if (set.Add(keySelector(v))) - { - Current = v; - result = true; - return true; - } - else - { - result = default; - return false; - } - } - - result = false; - return true; - } - } - } - - internal sealed class DistinctAwait : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> keySelector; - readonly IEqualityComparer comparer; - - public DistinctAwait(IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer) - { - this.source = source; - this.keySelector = keySelector; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _DistinctAwait(source, keySelector, comparer, cancellationToken); - } - - class _DistinctAwait : AsyncEnumeratorAwaitSelectorBase - { - readonly HashSet set; - readonly Func> keySelector; - - public _DistinctAwait(IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer, CancellationToken cancellationToken) - - : base(source, cancellationToken) - { - this.set = new HashSet(comparer); - this.keySelector = keySelector; - } - - protected override UniTask TransformAsync(TSource sourceCurrent) - { - return keySelector(sourceCurrent); - } - - protected override bool TrySetCurrentCore(TKey awaitResult, out bool terminateIteration) - { - if (set.Add(awaitResult)) - { - Current = SourceCurrent; - terminateIteration = false; - return true; - } - else - { - terminateIteration = false; - return false; - } - } - } - } - - internal sealed class DistinctAwaitWithCancellation : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> keySelector; - readonly IEqualityComparer comparer; - - public DistinctAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer) - { - this.source = source; - this.keySelector = keySelector; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _DistinctAwaitWithCancellation(source, keySelector, comparer, cancellationToken); - } - - class _DistinctAwaitWithCancellation : AsyncEnumeratorAwaitSelectorBase - { - readonly HashSet set; - readonly Func> keySelector; - - public _DistinctAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer, CancellationToken cancellationToken) - - : base(source, cancellationToken) - { - this.set = new HashSet(comparer); - this.keySelector = keySelector; - } - - protected override UniTask TransformAsync(TSource sourceCurrent) - { - return keySelector(sourceCurrent, cancellationToken); - } - - protected override bool TrySetCurrentCore(TKey awaitResult, out bool terminateIteration) - { - if (set.Add(awaitResult)) - { - Current = SourceCurrent; - terminateIteration = false; - return true; - } - else - { - terminateIteration = false; - return false; - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Distinct.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Distinct.cs.meta deleted file mode 100644 index 61804b7f..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Distinct.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8f09903be66e5d943b243d7c19cb3811 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/DistinctUntilChanged.cs b/VirtueSky/UniTask/Runtime/Linq/DistinctUntilChanged.cs deleted file mode 100644 index 141ba127..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/DistinctUntilChanged.cs +++ /dev/null @@ -1,662 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable DistinctUntilChanged(this IUniTaskAsyncEnumerable source) - { - return DistinctUntilChanged(source, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable DistinctUntilChanged(this IUniTaskAsyncEnumerable source, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new DistinctUntilChanged(source, comparer); - } - - public static IUniTaskAsyncEnumerable DistinctUntilChanged(this IUniTaskAsyncEnumerable source, Func keySelector) - { - return DistinctUntilChanged(source, keySelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable DistinctUntilChanged(this IUniTaskAsyncEnumerable source, Func keySelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new DistinctUntilChanged(source, keySelector, comparer); - } - - public static IUniTaskAsyncEnumerable DistinctUntilChangedAwait(this IUniTaskAsyncEnumerable source, Func> keySelector) - { - return DistinctUntilChangedAwait(source, keySelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable DistinctUntilChangedAwait(this IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new DistinctUntilChangedAwait(source, keySelector, comparer); - } - - public static IUniTaskAsyncEnumerable DistinctUntilChangedAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> keySelector) - { - return DistinctUntilChangedAwaitWithCancellation(source, keySelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable DistinctUntilChangedAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new DistinctUntilChangedAwaitWithCancellation(source, keySelector, comparer); - } - } - - internal sealed class DistinctUntilChanged : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly IEqualityComparer comparer; - - public DistinctUntilChanged(IUniTaskAsyncEnumerable source, IEqualityComparer comparer) - { - this.source = source; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _DistinctUntilChanged(source, comparer, cancellationToken); - } - - sealed class _DistinctUntilChanged : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - readonly IEqualityComparer comparer; - readonly CancellationToken cancellationToken; - - int state = -1; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - Action moveNextAction; - - public _DistinctUntilChanged(IUniTaskAsyncEnumerable source, IEqualityComparer comparer, CancellationToken cancellationToken) - { - this.source = source; - this.comparer = comparer; - this.cancellationToken = cancellationToken; - this.moveNextAction = MoveNext; - } - - public TSource Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (state == -2) return default; - - completionSource.Reset(); - MoveNext(); - return new UniTask(this, completionSource.Version); - } - - void MoveNext() - { - REPEAT: - try - { - switch (state) - { - case -1: // init - enumerator = source.GetAsyncEnumerator(cancellationToken); - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case -3; - } - else - { - state = -3; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case -3: // first - if (awaiter.GetResult()) - { - Current = enumerator.Current; - goto CONTINUE; - } - else - { - goto DONE; - } - case 0: // normal - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case 1; - } - else - { - state = 1; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case 1: - if (awaiter.GetResult()) - { - var v = enumerator.Current; - if (!comparer.Equals(Current, v)) - { - Current = v; - goto CONTINUE; - } - else - { - state = 0; - goto REPEAT; - } - } - else - { - goto DONE; - } - case -2: - default: - goto DONE; - } - } - catch (Exception ex) - { - state = -2; - completionSource.TrySetException(ex); - return; - } - - DONE: - state = -2; - completionSource.TrySetResult(false); - return; - - CONTINUE: - state = 0; - completionSource.TrySetResult(true); - return; - } - - public UniTask DisposeAsync() - { - return enumerator.DisposeAsync(); - } - } - } - - internal sealed class DistinctUntilChanged : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func keySelector; - readonly IEqualityComparer comparer; - - public DistinctUntilChanged(IUniTaskAsyncEnumerable source, Func keySelector, IEqualityComparer comparer) - { - this.source = source; - this.keySelector = keySelector; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _DistinctUntilChanged(source, keySelector, comparer, cancellationToken); - } - - sealed class _DistinctUntilChanged : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - readonly Func keySelector; - readonly IEqualityComparer comparer; - readonly CancellationToken cancellationToken; - - int state = -1; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - Action moveNextAction; - TKey prev; - - public _DistinctUntilChanged(IUniTaskAsyncEnumerable source, Func keySelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - this.source = source; - this.keySelector = keySelector; - this.comparer = comparer; - this.cancellationToken = cancellationToken; - this.moveNextAction = MoveNext; - } - - public TSource Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (state == -2) return default; - - completionSource.Reset(); - MoveNext(); - return new UniTask(this, completionSource.Version); - } - - void MoveNext() - { - REPEAT: - try - { - switch (state) - { - case -1: // init - enumerator = source.GetAsyncEnumerator(cancellationToken); - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case -3; - } - else - { - state = -3; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case -3: // first - if (awaiter.GetResult()) - { - Current = enumerator.Current; - goto CONTINUE; - } - else - { - goto DONE; - } - case 0: // normal - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case 1; - } - else - { - state = 1; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case 1: - if (awaiter.GetResult()) - { - var v = enumerator.Current; - var key = keySelector(v); - if (!comparer.Equals(prev, key)) - { - prev = key; - Current = v; - goto CONTINUE; - } - else - { - state = 0; - goto REPEAT; - } - } - else - { - goto DONE; - } - case -2: - default: - goto DONE; - } - } - catch (Exception ex) - { - state = -2; - completionSource.TrySetException(ex); - return; - } - - DONE: - state = -2; - completionSource.TrySetResult(false); - return; - - CONTINUE: - state = 0; - completionSource.TrySetResult(true); - return; - } - - public UniTask DisposeAsync() - { - return enumerator.DisposeAsync(); - } - } - } - - internal sealed class DistinctUntilChangedAwait : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> keySelector; - readonly IEqualityComparer comparer; - - public DistinctUntilChangedAwait(IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer) - { - this.source = source; - this.keySelector = keySelector; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _DistinctUntilChangedAwait(source, keySelector, comparer, cancellationToken); - } - - sealed class _DistinctUntilChangedAwait : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> keySelector; - readonly IEqualityComparer comparer; - readonly CancellationToken cancellationToken; - - int state = -1; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - UniTask.Awaiter awaiter2; - Action moveNextAction; - TSource enumeratorCurrent; - TKey prev; - - public _DistinctUntilChangedAwait(IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - this.source = source; - this.keySelector = keySelector; - this.comparer = comparer; - this.cancellationToken = cancellationToken; - this.moveNextAction = MoveNext; - } - - public TSource Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (state == -2) return default; - - completionSource.Reset(); - MoveNext(); - return new UniTask(this, completionSource.Version); - } - - void MoveNext() - { - REPEAT: - try - { - switch (state) - { - case -1: // init - enumerator = source.GetAsyncEnumerator(cancellationToken); - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case -3; - } - else - { - state = -3; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case -3: // first - if (awaiter.GetResult()) - { - Current = enumerator.Current; - goto CONTINUE; - } - else - { - goto DONE; - } - case 0: // normal - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case 1; - } - else - { - state = 1; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case 1: - if (awaiter.GetResult()) - { - enumeratorCurrent = enumerator.Current; - awaiter2 = keySelector(enumeratorCurrent).GetAwaiter(); - if (awaiter2.IsCompleted) - { - goto case 2; - } - else - { - state = 2; - awaiter2.UnsafeOnCompleted(moveNextAction); - return; - } - } - else - { - goto DONE; - } - case 2: - var key = awaiter2.GetResult(); - if (!comparer.Equals(prev, key)) - { - prev = key; - Current = enumeratorCurrent; - goto CONTINUE; - } - else - { - state = 0; - goto REPEAT; - } - case -2: - default: - goto DONE; - } - } - catch (Exception ex) - { - state = -2; - completionSource.TrySetException(ex); - return; - } - - DONE: - state = -2; - completionSource.TrySetResult(false); - return; - - CONTINUE: - state = 0; - completionSource.TrySetResult(true); - return; - } - - public UniTask DisposeAsync() - { - return enumerator.DisposeAsync(); - } - } - } - - internal sealed class DistinctUntilChangedAwaitWithCancellation : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> keySelector; - readonly IEqualityComparer comparer; - - public DistinctUntilChangedAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer) - { - this.source = source; - this.keySelector = keySelector; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _DistinctUntilChangedAwaitWithCancellation(source, keySelector, comparer, cancellationToken); - } - - sealed class _DistinctUntilChangedAwaitWithCancellation : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> keySelector; - readonly IEqualityComparer comparer; - readonly CancellationToken cancellationToken; - - int state = -1; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - UniTask.Awaiter awaiter2; - Action moveNextAction; - TSource enumeratorCurrent; - TKey prev; - - public _DistinctUntilChangedAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - this.source = source; - this.keySelector = keySelector; - this.comparer = comparer; - this.cancellationToken = cancellationToken; - this.moveNextAction = MoveNext; - } - - public TSource Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (state == -2) return default; - - completionSource.Reset(); - MoveNext(); - return new UniTask(this, completionSource.Version); - } - - void MoveNext() - { - REPEAT: - try - { - switch (state) - { - case -1: // init - enumerator = source.GetAsyncEnumerator(cancellationToken); - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case -3; - } - else - { - state = -3; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case -3: // first - if (awaiter.GetResult()) - { - Current = enumerator.Current; - goto CONTINUE; - } - else - { - goto DONE; - } - case 0: // normal - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case 1; - } - else - { - state = 1; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case 1: - if (awaiter.GetResult()) - { - enumeratorCurrent = enumerator.Current; - awaiter2 = keySelector(enumeratorCurrent, cancellationToken).GetAwaiter(); - if (awaiter2.IsCompleted) - { - goto case 2; - } - else - { - state = 2; - awaiter2.UnsafeOnCompleted(moveNextAction); - return; - } - } - else - { - goto DONE; - } - case 2: - var key = awaiter2.GetResult(); - if (!comparer.Equals(prev, key)) - { - prev = key; - Current = enumeratorCurrent; - goto CONTINUE; - } - else - { - state = 0; - goto REPEAT; - } - case -2: - default: - goto DONE; - } - } - catch (Exception ex) - { - state = -2; - completionSource.TrySetException(ex); - return; - } - - DONE: - state = -2; - completionSource.TrySetResult(false); - return; - - CONTINUE: - state = 0; - completionSource.TrySetResult(true); - return; - } - - public UniTask DisposeAsync() - { - return enumerator.DisposeAsync(); - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/DistinctUntilChanged.cs.meta b/VirtueSky/UniTask/Runtime/Linq/DistinctUntilChanged.cs.meta deleted file mode 100644 index 84cddf8d..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/DistinctUntilChanged.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0351f6767df7e644b935d4d599968162 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Do.cs b/VirtueSky/UniTask/Runtime/Linq/Do.cs deleted file mode 100644 index e3f51191..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Do.cs +++ /dev/null @@ -1,258 +0,0 @@ -using VirtueSky.Threading.Tasks; -using VirtueSky.Threading.Tasks.Internal; -using VirtueSky.Threading.Tasks.Linq; -using System; -using System.Threading; -using System.Threading.Tasks; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Do(this IUniTaskAsyncEnumerable source, Action onNext) - { - Error.ThrowArgumentNullException(source, nameof(source)); - return source.Do(onNext, null, null); - } - - public static IUniTaskAsyncEnumerable Do(this IUniTaskAsyncEnumerable source, Action onNext, Action onError) - { - Error.ThrowArgumentNullException(source, nameof(source)); - return source.Do(onNext, onError, null); - } - - public static IUniTaskAsyncEnumerable Do(this IUniTaskAsyncEnumerable source, Action onNext, Action onCompleted) - { - Error.ThrowArgumentNullException(source, nameof(source)); - return source.Do(onNext, null, onCompleted); - } - - public static IUniTaskAsyncEnumerable Do(this IUniTaskAsyncEnumerable source, Action onNext, Action onError, Action onCompleted) - { - Error.ThrowArgumentNullException(source, nameof(source)); - return new Do(source, onNext, onError, onCompleted); - } - - public static IUniTaskAsyncEnumerable Do(this IUniTaskAsyncEnumerable source, IObserver observer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(observer, nameof(observer)); - - return source.Do(observer.OnNext, observer.OnError, observer.OnCompleted); // alloc delegate. - } - - // not yet impl. - - //public static IUniTaskAsyncEnumerable DoAwait(this IUniTaskAsyncEnumerable source, Func onNext) - //{ - // throw new NotImplementedException(); - //} - - //public static IUniTaskAsyncEnumerable DoAwait(this IUniTaskAsyncEnumerable source, Func onNext, Func onError) - //{ - // throw new NotImplementedException(); - //} - - //public static IUniTaskAsyncEnumerable DoAwait(this IUniTaskAsyncEnumerable source, Func onNext, Func onCompleted) - //{ - // throw new NotImplementedException(); - //} - - //public static IUniTaskAsyncEnumerable DoAwait(this IUniTaskAsyncEnumerable source, Func onNext, Func onError, Func onCompleted) - //{ - // throw new NotImplementedException(); - //} - - //public static IUniTaskAsyncEnumerable DoAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func onNext) - //{ - // throw new NotImplementedException(); - //} - - //public static IUniTaskAsyncEnumerable DoAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func onNext, Func onError) - //{ - // throw new NotImplementedException(); - //} - - //public static IUniTaskAsyncEnumerable DoAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func onNext, Func onCompleted) - //{ - // throw new NotImplementedException(); - //} - - //public static IUniTaskAsyncEnumerable DoAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func onNext, Func onError, Func onCompleted) - //{ - // throw new NotImplementedException(); - //} - } - - internal sealed class Do : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Action onNext; - readonly Action onError; - readonly Action onCompleted; - - public Do(IUniTaskAsyncEnumerable source, Action onNext, Action onError, Action onCompleted) - { - this.source = source; - this.onNext = onNext; - this.onError = onError; - this.onCompleted = onCompleted; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Do(source, onNext, onError, onCompleted, cancellationToken); - } - - sealed class _Do : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action MoveNextCoreDelegate = MoveNextCore; - - readonly IUniTaskAsyncEnumerable source; - readonly Action onNext; - readonly Action onError; - readonly Action onCompleted; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - - public _Do(IUniTaskAsyncEnumerable source, Action onNext, Action onError, Action onCompleted, CancellationToken cancellationToken) - { - this.source = source; - this.onNext = onNext; - this.onError = onError; - this.onCompleted = onCompleted; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TSource Current { get; private set; } - - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - completionSource.Reset(); - - bool isCompleted = false; - try - { - if (enumerator == null) - { - enumerator = source.GetAsyncEnumerator(cancellationToken); - } - - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - isCompleted = awaiter.IsCompleted; - } - catch (Exception ex) - { - CallTrySetExceptionAfterNotification(ex); - return new UniTask(this, completionSource.Version); - } - - if (isCompleted) - { - MoveNextCore(this); - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - - return new UniTask(this, completionSource.Version); - } - - void CallTrySetExceptionAfterNotification(Exception ex) - { - if (onError != null) - { - try - { - onError(ex); - } - catch (Exception ex2) - { - completionSource.TrySetException(ex2); - return; - } - } - - completionSource.TrySetException(ex); - } - - bool TryGetResultWithNotification(UniTask.Awaiter awaiter, out T result) - { - try - { - result = awaiter.GetResult(); - return true; - } - catch (Exception ex) - { - CallTrySetExceptionAfterNotification(ex); - result = default; - return false; - } - } - - - static void MoveNextCore(object state) - { - var self = (_Do)state; - - if (self.TryGetResultWithNotification(self.awaiter, out var result)) - { - if (result) - { - var v = self.enumerator.Current; - - if (self.onNext != null) - { - try - { - self.onNext(v); - } - catch (Exception ex) - { - self.CallTrySetExceptionAfterNotification(ex); - } - } - - self.Current = v; - self.completionSource.TrySetResult(true); - } - else - { - if (self.onCompleted != null) - { - try - { - self.onCompleted(); - } - catch (Exception ex) - { - self.CallTrySetExceptionAfterNotification(ex); - return; - } - } - - self.completionSource.TrySetResult(false); - } - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - return default; - } - } - } - -} diff --git a/VirtueSky/UniTask/Runtime/Linq/Do.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Do.cs.meta deleted file mode 100644 index 766bbb5f..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Do.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: dd83c8e12dedf75409b829b93146d130 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/ElementAt.cs b/VirtueSky/UniTask/Runtime/Linq/ElementAt.cs deleted file mode 100644 index 37a7ab9e..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/ElementAt.cs +++ /dev/null @@ -1,58 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask ElementAtAsync(this IUniTaskAsyncEnumerable source, int index, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return ElementAt.ElementAtAsync(source, index, cancellationToken, false); - } - - public static UniTask ElementAtOrDefaultAsync(this IUniTaskAsyncEnumerable source, int index, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return ElementAt.ElementAtAsync(source, index, cancellationToken, true); - } - } - - internal static class ElementAt - { - public static async UniTask ElementAtAsync(IUniTaskAsyncEnumerable source, int index, CancellationToken cancellationToken, bool defaultIfEmpty) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - int i = 0; - while (await e.MoveNextAsync()) - { - if (i++ == index) - { - return e.Current; - } - } - - if (defaultIfEmpty) - { - return default; - } - else - { - throw Error.ArgumentOutOfRange(nameof(index)); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/ElementAt.cs.meta b/VirtueSky/UniTask/Runtime/Linq/ElementAt.cs.meta deleted file mode 100644 index fb0850b6..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/ElementAt.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c835bd2dd8555234c8919c7b8ef3b69a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Empty.cs b/VirtueSky/UniTask/Runtime/Linq/Empty.cs deleted file mode 100644 index ec2b065a..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Empty.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Empty() - { - return VirtueSky.Threading.Tasks.Linq.Empty.Instance; - } - } - - internal class Empty : IUniTaskAsyncEnumerable - { - public static readonly IUniTaskAsyncEnumerable Instance = new Empty(); - - Empty() - { - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return _Empty.Instance; - } - - class _Empty : IUniTaskAsyncEnumerator - { - public static readonly IUniTaskAsyncEnumerator Instance = new _Empty(); - - _Empty() - { - } - - public T Current => default; - - public UniTask MoveNextAsync() - { - return CompletedTasks.False; - } - - public UniTask DisposeAsync() - { - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Empty.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Empty.cs.meta deleted file mode 100644 index bfa577ac..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Empty.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4fa123ad6258abb4184721b719a13810 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Except.cs b/VirtueSky/UniTask/Runtime/Linq/Except.cs deleted file mode 100644 index 65ef6420..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Except.cs +++ /dev/null @@ -1,116 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Except(this IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second) - { - Error.ThrowArgumentNullException(first, nameof(first)); - Error.ThrowArgumentNullException(second, nameof(second)); - - return new Except(first, second, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable Except(this IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(first, nameof(first)); - Error.ThrowArgumentNullException(second, nameof(second)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new Except(first, second, comparer); - } - } - - internal sealed class Except : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable first; - readonly IUniTaskAsyncEnumerable second; - readonly IEqualityComparer comparer; - - public Except(IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, IEqualityComparer comparer) - { - this.first = first; - this.second = second; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Except(first, second, comparer, cancellationToken); - } - - class _Except : AsyncEnumeratorBase - { - static Action HashSetAsyncCoreDelegate = HashSetAsyncCore; - - readonly IEqualityComparer comparer; - readonly IUniTaskAsyncEnumerable second; - - HashSet set; - UniTask>.Awaiter awaiter; - - public _Except(IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, IEqualityComparer comparer, CancellationToken cancellationToken) - - : base(first, cancellationToken) - { - this.second = second; - this.comparer = comparer; - } - - protected override bool OnFirstIteration() - { - if (set != null) return false; - - awaiter = second.ToHashSetAsync(cancellationToken).GetAwaiter(); - if (awaiter.IsCompleted) - { - set = awaiter.GetResult(); - SourceMoveNext(); - } - else - { - awaiter.SourceOnCompleted(HashSetAsyncCoreDelegate, this); - } - - return true; - } - - static void HashSetAsyncCore(object state) - { - var self = (_Except)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - self.set = result; - self.SourceMoveNext(); - } - } - - protected override bool TryMoveNextCore(bool sourceHasCurrent, out bool result) - { - if (sourceHasCurrent) - { - var v = SourceCurrent; - if (set.Add(v)) - { - Current = v; - result = true; - return true; - } - else - { - result = default; - return false; - } - } - - result = false; - return true; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Except.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Except.cs.meta deleted file mode 100644 index f61a1aab..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Except.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 38c1c4129f59dcb49a5b864eaf4ec63c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/First.cs b/VirtueSky/UniTask/Runtime/Linq/First.cs deleted file mode 100644 index 97788a31..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/First.cs +++ /dev/null @@ -1,200 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask FirstAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return First.FirstAsync(source, cancellationToken, false); - } - - public static UniTask FirstAsync(this IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return First.FirstAsync(source, predicate, cancellationToken, false); - } - - public static UniTask FirstAwaitAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return First.FirstAwaitAsync(source, predicate, cancellationToken, false); - } - - public static UniTask FirstAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return First.FirstAwaitWithCancellationAsync(source, predicate, cancellationToken, false); - } - - public static UniTask FirstOrDefaultAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return First.FirstAsync(source, cancellationToken, true); - } - - public static UniTask FirstOrDefaultAsync(this IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return First.FirstAsync(source, predicate, cancellationToken, true); - } - - public static UniTask FirstOrDefaultAwaitAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return First.FirstAwaitAsync(source, predicate, cancellationToken, true); - } - - public static UniTask FirstOrDefaultAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return First.FirstAwaitWithCancellationAsync(source, predicate, cancellationToken, true); - } - } - - internal static class First - { - public static async UniTask FirstAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken, bool defaultIfEmpty) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - if (await e.MoveNextAsync()) - { - return e.Current; - } - else - { - if (defaultIfEmpty) - { - return default; - } - else - { - throw Error.NoElements(); - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTask FirstAsync(IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken, bool defaultIfEmpty) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = e.Current; - if (predicate(v)) - { - return v; - } - } - - if (defaultIfEmpty) - { - return default; - } - else - { - throw Error.NoElements(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTask FirstAwaitAsync(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken, bool defaultIfEmpty) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = e.Current; - if (await predicate(v)) - { - return v; - } - } - - if (defaultIfEmpty) - { - return default; - } - else - { - throw Error.NoElements(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTask FirstAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken, bool defaultIfEmpty) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = e.Current; - if (await predicate(v, cancellationToken)) - { - return v; - } - } - - if (defaultIfEmpty) - { - return default; - } - else - { - throw Error.NoElements(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/First.cs.meta b/VirtueSky/UniTask/Runtime/Linq/First.cs.meta deleted file mode 100644 index 6924307a..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/First.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 417946e97e9eed84db6f840f57037ca6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/ForEach.cs b/VirtueSky/UniTask/Runtime/Linq/ForEach.cs deleted file mode 100644 index d3af58d4..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/ForEach.cs +++ /dev/null @@ -1,193 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask ForEachAsync(this IUniTaskAsyncEnumerable source, Action action, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(action, nameof(action)); - - return VirtueSky.Threading.Tasks.Linq.ForEach.ForEachAsync(source, action, cancellationToken); - } - - public static UniTask ForEachAsync(this IUniTaskAsyncEnumerable source, Action action, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(action, nameof(action)); - - return VirtueSky.Threading.Tasks.Linq.ForEach.ForEachAsync(source, action, cancellationToken); - } - - /// Obsolete(Error), Use Use ForEachAwaitAsync instead. - [Obsolete("Use ForEachAwaitAsync instead.", true)] - [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] - public static UniTask ForEachAsync(this IUniTaskAsyncEnumerable source, Func action, CancellationToken cancellationToken = default) - { - throw new NotSupportedException("Use ForEachAwaitAsync instead."); - } - - /// Obsolete(Error), Use Use ForEachAwaitAsync instead. - [Obsolete("Use ForEachAwaitAsync instead.", true)] - [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] - public static UniTask ForEachAsync(this IUniTaskAsyncEnumerable source, Func action, CancellationToken cancellationToken = default) - { - throw new NotSupportedException("Use ForEachAwaitAsync instead."); - } - - public static UniTask ForEachAwaitAsync(this IUniTaskAsyncEnumerable source, Func action, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(action, nameof(action)); - - return VirtueSky.Threading.Tasks.Linq.ForEach.ForEachAwaitAsync(source, action, cancellationToken); - } - - public static UniTask ForEachAwaitAsync(this IUniTaskAsyncEnumerable source, Func action, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(action, nameof(action)); - - return VirtueSky.Threading.Tasks.Linq.ForEach.ForEachAwaitAsync(source, action, cancellationToken); - } - - public static UniTask ForEachAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func action, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(action, nameof(action)); - - return VirtueSky.Threading.Tasks.Linq.ForEach.ForEachAwaitWithCancellationAsync(source, action, cancellationToken); - } - - public static UniTask ForEachAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func action, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(action, nameof(action)); - - return VirtueSky.Threading.Tasks.Linq.ForEach.ForEachAwaitWithCancellationAsync(source, action, cancellationToken); - } - } - - internal static class ForEach - { - public static async UniTask ForEachAsync(IUniTaskAsyncEnumerable source, Action action, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - action(e.Current); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTask ForEachAsync(IUniTaskAsyncEnumerable source, Action action, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - int index = 0; - while (await e.MoveNextAsync()) - { - action(e.Current, checked(index++)); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTask ForEachAwaitAsync(IUniTaskAsyncEnumerable source, Func action, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - await action(e.Current); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTask ForEachAwaitAsync(IUniTaskAsyncEnumerable source, Func action, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - int index = 0; - while (await e.MoveNextAsync()) - { - await action(e.Current, checked(index++)); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTask ForEachAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func action, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - await action(e.Current, cancellationToken); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTask ForEachAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func action, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - int index = 0; - while (await e.MoveNextAsync()) - { - await action(e.Current, checked(index++), cancellationToken); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/ForEach.cs.meta b/VirtueSky/UniTask/Runtime/Linq/ForEach.cs.meta deleted file mode 100644 index 53177562..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/ForEach.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ca8d7f8177ba16140920af405aea3fd4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/GroupBy.cs b/VirtueSky/UniTask/Runtime/Linq/GroupBy.cs deleted file mode 100644 index cfacb325..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/GroupBy.cs +++ /dev/null @@ -1,923 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - // Ix-Async returns IGrouping but it is competely waste, use standard IGrouping. - - public static IUniTaskAsyncEnumerable> GroupBy(this IUniTaskAsyncEnumerable source, Func keySelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - return new GroupBy(source, keySelector, x => x, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable> GroupBy(this IUniTaskAsyncEnumerable source, Func keySelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - return new GroupBy(source, keySelector, x => x, comparer); - } - - public static IUniTaskAsyncEnumerable> GroupBy(this IUniTaskAsyncEnumerable source, Func keySelector, Func elementSelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - return new GroupBy(source, keySelector, elementSelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable> GroupBy(this IUniTaskAsyncEnumerable source, Func keySelector, Func elementSelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - return new GroupBy(source, keySelector, elementSelector, comparer); - } - - public static IUniTaskAsyncEnumerable GroupBy(this IUniTaskAsyncEnumerable source, Func keySelector, Func, TResult> resultSelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - return new GroupBy(source, keySelector, x => x, resultSelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable GroupBy(this IUniTaskAsyncEnumerable source, Func keySelector, Func, TResult> resultSelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - return new GroupBy(source, keySelector, x => x, resultSelector, comparer); - } - - public static IUniTaskAsyncEnumerable GroupBy(this IUniTaskAsyncEnumerable source, Func keySelector, Func elementSelector, Func, TResult> resultSelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - return new GroupBy(source, keySelector, elementSelector, resultSelector, EqualityComparer.Default); - } - public static IUniTaskAsyncEnumerable GroupBy(this IUniTaskAsyncEnumerable source, Func keySelector, Func elementSelector, Func, TResult> resultSelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - return new GroupBy(source, keySelector, elementSelector, resultSelector, comparer); - } - - // await - - public static IUniTaskAsyncEnumerable> GroupByAwait(this IUniTaskAsyncEnumerable source, Func> keySelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - return new GroupByAwait(source, keySelector, x => UniTask.FromResult(x), EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable> GroupByAwait(this IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - return new GroupByAwait(source, keySelector, x => UniTask.FromResult(x), comparer); - } - - public static IUniTaskAsyncEnumerable> GroupByAwait(this IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - return new GroupByAwait(source, keySelector, elementSelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable> GroupByAwait(this IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - return new GroupByAwait(source, keySelector, elementSelector, comparer); - } - - public static IUniTaskAsyncEnumerable GroupByAwait(this IUniTaskAsyncEnumerable source, Func> keySelector, Func, UniTask> resultSelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - return new GroupByAwait(source, keySelector, x => UniTask.FromResult(x), resultSelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable GroupByAwait(this IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, Func, UniTask> resultSelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - return new GroupByAwait(source, keySelector, elementSelector, resultSelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable GroupByAwait(this IUniTaskAsyncEnumerable source, Func> keySelector, Func, UniTask> resultSelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - return new GroupByAwait(source, keySelector, x => UniTask.FromResult(x), resultSelector, comparer); - } - - public static IUniTaskAsyncEnumerable GroupByAwait(this IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, Func, UniTask> resultSelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - return new GroupByAwait(source, keySelector, elementSelector, resultSelector, comparer); - } - - // with ct - - public static IUniTaskAsyncEnumerable> GroupByAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> keySelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - return new GroupByAwaitWithCancellation(source, keySelector, (x, _) => UniTask.FromResult(x), EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable> GroupByAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - return new GroupByAwaitWithCancellation(source, keySelector, (x, _) => UniTask.FromResult(x), comparer); - } - - public static IUniTaskAsyncEnumerable> GroupByAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - return new GroupByAwaitWithCancellation(source, keySelector, elementSelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable> GroupByAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - return new GroupByAwaitWithCancellation(source, keySelector, elementSelector, comparer); - } - - public static IUniTaskAsyncEnumerable GroupByAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> keySelector, Func, CancellationToken, UniTask> resultSelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - return new GroupByAwaitWithCancellation(source, keySelector, (x, _) => UniTask.FromResult(x), resultSelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable GroupByAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, Func, CancellationToken, UniTask> resultSelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - return new GroupByAwaitWithCancellation(source, keySelector, elementSelector, resultSelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable GroupByAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> keySelector, Func, CancellationToken, UniTask> resultSelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - return new GroupByAwaitWithCancellation(source, keySelector, (x, _) => UniTask.FromResult(x), resultSelector, comparer); - } - - public static IUniTaskAsyncEnumerable GroupByAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, Func, CancellationToken, UniTask> resultSelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - return new GroupByAwaitWithCancellation(source, keySelector, elementSelector, resultSelector, comparer); - } - } - - internal sealed class GroupBy : IUniTaskAsyncEnumerable> - { - readonly IUniTaskAsyncEnumerable source; - readonly Func keySelector; - readonly Func elementSelector; - readonly IEqualityComparer comparer; - - public GroupBy(IUniTaskAsyncEnumerable source, Func keySelector, Func elementSelector, IEqualityComparer comparer) - { - this.source = source; - this.keySelector = keySelector; - this.elementSelector = elementSelector; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator> GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _GroupBy(source, keySelector, elementSelector, comparer, cancellationToken); - } - - sealed class _GroupBy : MoveNextSource, IUniTaskAsyncEnumerator> - { - readonly IUniTaskAsyncEnumerable source; - readonly Func keySelector; - readonly Func elementSelector; - readonly IEqualityComparer comparer; - CancellationToken cancellationToken; - - IEnumerator> groupEnumerator; - - public _GroupBy(IUniTaskAsyncEnumerable source, Func keySelector, Func elementSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - this.source = source; - this.keySelector = keySelector; - this.elementSelector = elementSelector; - this.comparer = comparer; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public IGrouping Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - completionSource.Reset(); - - if (groupEnumerator == null) - { - CreateLookup().Forget(); - } - else - { - SourceMoveNext(); - } - return new UniTask(this, completionSource.Version); - } - - async UniTaskVoid CreateLookup() - { - try - { - var lookup = await source.ToLookupAsync(keySelector, elementSelector, comparer, cancellationToken); - groupEnumerator = lookup.GetEnumerator(); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - SourceMoveNext(); - } - - void SourceMoveNext() - { - try - { - if (groupEnumerator.MoveNext()) - { - Current = groupEnumerator.Current as IGrouping; - completionSource.TrySetResult(true); - } - else - { - completionSource.TrySetResult(false); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (groupEnumerator != null) - { - groupEnumerator.Dispose(); - } - - return default; - } - } - } - - internal sealed class GroupBy : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func keySelector; - readonly Func elementSelector; - readonly Func, TResult> resultSelector; - readonly IEqualityComparer comparer; - - public GroupBy(IUniTaskAsyncEnumerable source, Func keySelector, Func elementSelector, Func, TResult> resultSelector, IEqualityComparer comparer) - { - this.source = source; - this.keySelector = keySelector; - this.elementSelector = elementSelector; - this.resultSelector = resultSelector; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _GroupBy(source, keySelector, elementSelector, resultSelector, comparer, cancellationToken); - } - - sealed class _GroupBy : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - readonly Func keySelector; - readonly Func elementSelector; - readonly Func, TResult> resultSelector; - readonly IEqualityComparer comparer; - CancellationToken cancellationToken; - - IEnumerator> groupEnumerator; - - public _GroupBy(IUniTaskAsyncEnumerable source, Func keySelector, Func elementSelector, Func, TResult> resultSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - this.source = source; - this.keySelector = keySelector; - this.elementSelector = elementSelector; - this.resultSelector = resultSelector; - this.comparer = comparer; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - completionSource.Reset(); - - if (groupEnumerator == null) - { - CreateLookup().Forget(); - } - else - { - SourceMoveNext(); - } - return new UniTask(this, completionSource.Version); - } - - async UniTaskVoid CreateLookup() - { - try - { - var lookup = await source.ToLookupAsync(keySelector, elementSelector, comparer, cancellationToken); - groupEnumerator = lookup.GetEnumerator(); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - SourceMoveNext(); - } - - void SourceMoveNext() - { - try - { - if (groupEnumerator.MoveNext()) - { - var current = groupEnumerator.Current; - Current = resultSelector(current.Key, current); - completionSource.TrySetResult(true); - } - else - { - completionSource.TrySetResult(false); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (groupEnumerator != null) - { - groupEnumerator.Dispose(); - } - - return default; - } - } - } - - internal sealed class GroupByAwait : IUniTaskAsyncEnumerable> - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> keySelector; - readonly Func> elementSelector; - readonly IEqualityComparer comparer; - - public GroupByAwait(IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, IEqualityComparer comparer) - { - this.source = source; - this.keySelector = keySelector; - this.elementSelector = elementSelector; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator> GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _GroupByAwait(source, keySelector, elementSelector, comparer, cancellationToken); - } - - sealed class _GroupByAwait : MoveNextSource, IUniTaskAsyncEnumerator> - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> keySelector; - readonly Func> elementSelector; - readonly IEqualityComparer comparer; - CancellationToken cancellationToken; - - IEnumerator> groupEnumerator; - - public _GroupByAwait(IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - this.source = source; - this.keySelector = keySelector; - this.elementSelector = elementSelector; - this.comparer = comparer; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public IGrouping Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - completionSource.Reset(); - - if (groupEnumerator == null) - { - CreateLookup().Forget(); - } - else - { - SourceMoveNext(); - } - return new UniTask(this, completionSource.Version); - } - - async UniTaskVoid CreateLookup() - { - try - { - var lookup = await source.ToLookupAwaitAsync(keySelector, elementSelector, comparer, cancellationToken); - groupEnumerator = lookup.GetEnumerator(); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - SourceMoveNext(); - } - - void SourceMoveNext() - { - try - { - if (groupEnumerator.MoveNext()) - { - Current = groupEnumerator.Current as IGrouping; - completionSource.TrySetResult(true); - } - else - { - completionSource.TrySetResult(false); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (groupEnumerator != null) - { - groupEnumerator.Dispose(); - } - - return default; - } - } - } - - internal sealed class GroupByAwait : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> keySelector; - readonly Func> elementSelector; - readonly Func, UniTask> resultSelector; - readonly IEqualityComparer comparer; - - public GroupByAwait(IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, Func, UniTask> resultSelector, IEqualityComparer comparer) - { - this.source = source; - this.keySelector = keySelector; - this.elementSelector = elementSelector; - this.resultSelector = resultSelector; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _GroupByAwait(source, keySelector, elementSelector, resultSelector, comparer, cancellationToken); - } - - sealed class _GroupByAwait : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly static Action ResultSelectCoreDelegate = ResultSelectCore; - - readonly IUniTaskAsyncEnumerable source; - readonly Func> keySelector; - readonly Func> elementSelector; - readonly Func, UniTask> resultSelector; - readonly IEqualityComparer comparer; - CancellationToken cancellationToken; - - IEnumerator> groupEnumerator; - UniTask.Awaiter awaiter; - - public _GroupByAwait(IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, Func, UniTask> resultSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - this.source = source; - this.keySelector = keySelector; - this.elementSelector = elementSelector; - this.resultSelector = resultSelector; - this.comparer = comparer; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - completionSource.Reset(); - - if (groupEnumerator == null) - { - CreateLookup().Forget(); - } - else - { - SourceMoveNext(); - } - return new UniTask(this, completionSource.Version); - } - - async UniTaskVoid CreateLookup() - { - try - { - var lookup = await source.ToLookupAwaitAsync(keySelector, elementSelector, comparer, cancellationToken); - groupEnumerator = lookup.GetEnumerator(); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - SourceMoveNext(); - } - - void SourceMoveNext() - { - try - { - if (groupEnumerator.MoveNext()) - { - var current = groupEnumerator.Current; - - awaiter = resultSelector(current.Key, current).GetAwaiter(); - if (awaiter.IsCompleted) - { - ResultSelectCore(this); - } - else - { - awaiter.SourceOnCompleted(ResultSelectCoreDelegate, this); - } - return; - } - else - { - completionSource.TrySetResult(false); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - } - - static void ResultSelectCore(object state) - { - var self = (_GroupByAwait)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - self.Current = result; - self.completionSource.TrySetResult(true); - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (groupEnumerator != null) - { - groupEnumerator.Dispose(); - } - - return default; - } - } - } - - internal sealed class GroupByAwaitWithCancellation : IUniTaskAsyncEnumerable> - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> keySelector; - readonly Func> elementSelector; - readonly IEqualityComparer comparer; - - public GroupByAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, IEqualityComparer comparer) - { - this.source = source; - this.keySelector = keySelector; - this.elementSelector = elementSelector; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator> GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _GroupByAwaitWithCancellation(source, keySelector, elementSelector, comparer, cancellationToken); - } - - sealed class _GroupByAwaitWithCancellation : MoveNextSource, IUniTaskAsyncEnumerator> - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> keySelector; - readonly Func> elementSelector; - readonly IEqualityComparer comparer; - CancellationToken cancellationToken; - - IEnumerator> groupEnumerator; - - public _GroupByAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - this.source = source; - this.keySelector = keySelector; - this.elementSelector = elementSelector; - this.comparer = comparer; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public IGrouping Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - completionSource.Reset(); - - if (groupEnumerator == null) - { - CreateLookup().Forget(); - } - else - { - SourceMoveNext(); - } - return new UniTask(this, completionSource.Version); - } - - async UniTaskVoid CreateLookup() - { - try - { - var lookup = await source.ToLookupAwaitWithCancellationAsync(keySelector, elementSelector, comparer, cancellationToken); - groupEnumerator = lookup.GetEnumerator(); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - SourceMoveNext(); - } - - void SourceMoveNext() - { - try - { - if (groupEnumerator.MoveNext()) - { - Current = groupEnumerator.Current as IGrouping; - completionSource.TrySetResult(true); - } - else - { - completionSource.TrySetResult(false); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (groupEnumerator != null) - { - groupEnumerator.Dispose(); - } - - return default; - } - } - } - - internal sealed class GroupByAwaitWithCancellation : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> keySelector; - readonly Func> elementSelector; - readonly Func, CancellationToken, UniTask> resultSelector; - readonly IEqualityComparer comparer; - - public GroupByAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, Func, CancellationToken, UniTask> resultSelector, IEqualityComparer comparer) - { - this.source = source; - this.keySelector = keySelector; - this.elementSelector = elementSelector; - this.resultSelector = resultSelector; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _GroupByAwaitWithCancellation(source, keySelector, elementSelector, resultSelector, comparer, cancellationToken); - } - - sealed class _GroupByAwaitWithCancellation : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly static Action ResultSelectCoreDelegate = ResultSelectCore; - - readonly IUniTaskAsyncEnumerable source; - readonly Func> keySelector; - readonly Func> elementSelector; - readonly Func, CancellationToken, UniTask> resultSelector; - readonly IEqualityComparer comparer; - CancellationToken cancellationToken; - - IEnumerator> groupEnumerator; - UniTask.Awaiter awaiter; - - public _GroupByAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, Func, CancellationToken, UniTask> resultSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - this.source = source; - this.keySelector = keySelector; - this.elementSelector = elementSelector; - this.resultSelector = resultSelector; - this.comparer = comparer; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - completionSource.Reset(); - - if (groupEnumerator == null) - { - CreateLookup().Forget(); - } - else - { - SourceMoveNext(); - } - return new UniTask(this, completionSource.Version); - } - - async UniTaskVoid CreateLookup() - { - try - { - var lookup = await source.ToLookupAwaitWithCancellationAsync(keySelector, elementSelector, comparer, cancellationToken); - groupEnumerator = lookup.GetEnumerator(); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - SourceMoveNext(); - } - - void SourceMoveNext() - { - try - { - if (groupEnumerator.MoveNext()) - { - var current = groupEnumerator.Current; - - awaiter = resultSelector(current.Key, current, cancellationToken).GetAwaiter(); - if (awaiter.IsCompleted) - { - ResultSelectCore(this); - } - else - { - awaiter.SourceOnCompleted(ResultSelectCoreDelegate, this); - } - return; - } - else - { - completionSource.TrySetResult(false); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - } - - static void ResultSelectCore(object state) - { - var self = (_GroupByAwaitWithCancellation)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - self.Current = result; - self.completionSource.TrySetResult(true); - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (groupEnumerator != null) - { - groupEnumerator.Dispose(); - } - - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/GroupBy.cs.meta b/VirtueSky/UniTask/Runtime/Linq/GroupBy.cs.meta deleted file mode 100644 index 14897018..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/GroupBy.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a2de80df1cc8a1240ab0ee7badd334d0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/GroupJoin.cs b/VirtueSky/UniTask/Runtime/Linq/GroupJoin.cs deleted file mode 100644 index 92072b44..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/GroupJoin.cs +++ /dev/null @@ -1,612 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable GroupJoin(this IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func outerKeySelector, Func innerKeySelector, Func, TResult> resultSelector) - { - Error.ThrowArgumentNullException(outer, nameof(outer)); - Error.ThrowArgumentNullException(inner, nameof(inner)); - Error.ThrowArgumentNullException(outerKeySelector, nameof(outerKeySelector)); - Error.ThrowArgumentNullException(innerKeySelector, nameof(innerKeySelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new GroupJoin(outer, inner, outerKeySelector, innerKeySelector, resultSelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable GroupJoin(this IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func outerKeySelector, Func innerKeySelector, Func, TResult> resultSelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(outer, nameof(outer)); - Error.ThrowArgumentNullException(inner, nameof(inner)); - Error.ThrowArgumentNullException(outerKeySelector, nameof(outerKeySelector)); - Error.ThrowArgumentNullException(innerKeySelector, nameof(innerKeySelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new GroupJoin(outer, inner, outerKeySelector, innerKeySelector, resultSelector, comparer); - } - - public static IUniTaskAsyncEnumerable GroupJoinAwait(this IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func> outerKeySelector, Func> innerKeySelector, Func, UniTask> resultSelector) - { - Error.ThrowArgumentNullException(outer, nameof(outer)); - Error.ThrowArgumentNullException(inner, nameof(inner)); - Error.ThrowArgumentNullException(outerKeySelector, nameof(outerKeySelector)); - Error.ThrowArgumentNullException(innerKeySelector, nameof(innerKeySelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new GroupJoinAwait(outer, inner, outerKeySelector, innerKeySelector, resultSelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable GroupJoinAwait(this IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func> outerKeySelector, Func> innerKeySelector, Func, UniTask> resultSelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(outer, nameof(outer)); - Error.ThrowArgumentNullException(inner, nameof(inner)); - Error.ThrowArgumentNullException(outerKeySelector, nameof(outerKeySelector)); - Error.ThrowArgumentNullException(innerKeySelector, nameof(innerKeySelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new GroupJoinAwait(outer, inner, outerKeySelector, innerKeySelector, resultSelector, comparer); - } - - public static IUniTaskAsyncEnumerable GroupJoinAwaitWithCancellation(this IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func> outerKeySelector, Func> innerKeySelector, Func, CancellationToken, UniTask> resultSelector) - { - Error.ThrowArgumentNullException(outer, nameof(outer)); - Error.ThrowArgumentNullException(inner, nameof(inner)); - Error.ThrowArgumentNullException(outerKeySelector, nameof(outerKeySelector)); - Error.ThrowArgumentNullException(innerKeySelector, nameof(innerKeySelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new GroupJoinAwaitWithCancellation(outer, inner, outerKeySelector, innerKeySelector, resultSelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable GroupJoinAwaitWithCancellation(this IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func> outerKeySelector, Func> innerKeySelector, Func, CancellationToken, UniTask> resultSelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(outer, nameof(outer)); - Error.ThrowArgumentNullException(inner, nameof(inner)); - Error.ThrowArgumentNullException(outerKeySelector, nameof(outerKeySelector)); - Error.ThrowArgumentNullException(innerKeySelector, nameof(innerKeySelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new GroupJoinAwaitWithCancellation(outer, inner, outerKeySelector, innerKeySelector, resultSelector, comparer); - } - - } - - internal sealed class GroupJoin : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable outer; - readonly IUniTaskAsyncEnumerable inner; - readonly Func outerKeySelector; - readonly Func innerKeySelector; - readonly Func, TResult> resultSelector; - readonly IEqualityComparer comparer; - - public GroupJoin(IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func outerKeySelector, Func innerKeySelector, Func, TResult> resultSelector, IEqualityComparer comparer) - { - this.outer = outer; - this.inner = inner; - this.outerKeySelector = outerKeySelector; - this.innerKeySelector = innerKeySelector; - this.resultSelector = resultSelector; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _GroupJoin(outer, inner, outerKeySelector, innerKeySelector, resultSelector, comparer, cancellationToken); - } - - sealed class _GroupJoin : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action MoveNextCoreDelegate = MoveNextCore; - - readonly IUniTaskAsyncEnumerable outer; - readonly IUniTaskAsyncEnumerable inner; - readonly Func outerKeySelector; - readonly Func innerKeySelector; - readonly Func, TResult> resultSelector; - readonly IEqualityComparer comparer; - CancellationToken cancellationToken; - - ILookup lookup; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - - - public _GroupJoin(IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func outerKeySelector, Func innerKeySelector, Func, TResult> resultSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - this.outer = outer; - this.inner = inner; - this.outerKeySelector = outerKeySelector; - this.innerKeySelector = innerKeySelector; - this.resultSelector = resultSelector; - this.comparer = comparer; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - completionSource.Reset(); - - if (lookup == null) - { - CreateLookup().Forget(); - } - else - { - SourceMoveNext(); - } - return new UniTask(this, completionSource.Version); - } - - async UniTaskVoid CreateLookup() - { - try - { - lookup = await inner.ToLookupAsync(innerKeySelector, comparer, cancellationToken); - enumerator = outer.GetAsyncEnumerator(cancellationToken); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - SourceMoveNext(); - } - - void SourceMoveNext() - { - try - { - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - MoveNextCore(this); - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - } - - static void MoveNextCore(object state) - { - var self = (_GroupJoin)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - var outer = self.enumerator.Current; - var key = self.outerKeySelector(outer); - var values = self.lookup[key]; - - self.Current = self.resultSelector(outer, values); - self.completionSource.TrySetResult(true); - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - - return default; - } - } - } - - internal sealed class GroupJoinAwait : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable outer; - readonly IUniTaskAsyncEnumerable inner; - readonly Func> outerKeySelector; - readonly Func> innerKeySelector; - readonly Func, UniTask> resultSelector; - readonly IEqualityComparer comparer; - - public GroupJoinAwait(IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func> outerKeySelector, Func> innerKeySelector, Func, UniTask> resultSelector, IEqualityComparer comparer) - { - this.outer = outer; - this.inner = inner; - this.outerKeySelector = outerKeySelector; - this.innerKeySelector = innerKeySelector; - this.resultSelector = resultSelector; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _GroupJoinAwait(outer, inner, outerKeySelector, innerKeySelector, resultSelector, comparer, cancellationToken); - } - - sealed class _GroupJoinAwait : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action MoveNextCoreDelegate = MoveNextCore; - readonly static Action ResultSelectCoreDelegate = ResultSelectCore; - readonly static Action OuterKeySelectCoreDelegate = OuterKeySelectCore; - - readonly IUniTaskAsyncEnumerable outer; - readonly IUniTaskAsyncEnumerable inner; - readonly Func> outerKeySelector; - readonly Func> innerKeySelector; - readonly Func, UniTask> resultSelector; - readonly IEqualityComparer comparer; - CancellationToken cancellationToken; - - ILookup lookup; - IUniTaskAsyncEnumerator enumerator; - TOuter outerValue; - UniTask.Awaiter awaiter; - UniTask.Awaiter outerKeyAwaiter; - UniTask.Awaiter resultAwaiter; - - - public _GroupJoinAwait(IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func> outerKeySelector, Func> innerKeySelector, Func, UniTask> resultSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - this.outer = outer; - this.inner = inner; - this.outerKeySelector = outerKeySelector; - this.innerKeySelector = innerKeySelector; - this.resultSelector = resultSelector; - this.comparer = comparer; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - completionSource.Reset(); - - if (lookup == null) - { - CreateLookup().Forget(); - } - else - { - SourceMoveNext(); - } - return new UniTask(this, completionSource.Version); - } - - async UniTaskVoid CreateLookup() - { - try - { - lookup = await inner.ToLookupAwaitAsync(innerKeySelector, comparer, cancellationToken); - enumerator = outer.GetAsyncEnumerator(cancellationToken); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - SourceMoveNext(); - } - - void SourceMoveNext() - { - try - { - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - MoveNextCore(this); - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - } - - static void MoveNextCore(object state) - { - var self = (_GroupJoinAwait)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - try - { - - self.outerValue = self.enumerator.Current; - self.outerKeyAwaiter = self.outerKeySelector(self.outerValue).GetAwaiter(); - if (self.outerKeyAwaiter.IsCompleted) - { - OuterKeySelectCore(self); - } - else - { - self.outerKeyAwaiter.SourceOnCompleted(OuterKeySelectCoreDelegate, self); - } - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - } - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - - static void OuterKeySelectCore(object state) - { - var self = (_GroupJoinAwait)state; - - if (self.TryGetResult(self.outerKeyAwaiter, out var result)) - { - try - { - var values = self.lookup[result]; - self.resultAwaiter = self.resultSelector(self.outerValue, values).GetAwaiter(); - if (self.resultAwaiter.IsCompleted) - { - ResultSelectCore(self); - } - else - { - self.resultAwaiter.SourceOnCompleted(ResultSelectCoreDelegate, self); - } - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - } - } - } - - static void ResultSelectCore(object state) - { - var self = (_GroupJoinAwait)state; - - if (self.TryGetResult(self.resultAwaiter, out var result)) - { - self.Current = result; - self.completionSource.TrySetResult(true); - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - - return default; - } - } - } - - internal sealed class GroupJoinAwaitWithCancellation : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable outer; - readonly IUniTaskAsyncEnumerable inner; - readonly Func> outerKeySelector; - readonly Func> innerKeySelector; - readonly Func, CancellationToken, UniTask> resultSelector; - readonly IEqualityComparer comparer; - - public GroupJoinAwaitWithCancellation(IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func> outerKeySelector, Func> innerKeySelector, Func, CancellationToken, UniTask> resultSelector, IEqualityComparer comparer) - { - this.outer = outer; - this.inner = inner; - this.outerKeySelector = outerKeySelector; - this.innerKeySelector = innerKeySelector; - this.resultSelector = resultSelector; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _GroupJoinAwaitWithCancellation(outer, inner, outerKeySelector, innerKeySelector, resultSelector, comparer, cancellationToken); - } - - sealed class _GroupJoinAwaitWithCancellation : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action MoveNextCoreDelegate = MoveNextCore; - readonly static Action ResultSelectCoreDelegate = ResultSelectCore; - readonly static Action OuterKeySelectCoreDelegate = OuterKeySelectCore; - - readonly IUniTaskAsyncEnumerable outer; - readonly IUniTaskAsyncEnumerable inner; - readonly Func> outerKeySelector; - readonly Func> innerKeySelector; - readonly Func, CancellationToken, UniTask> resultSelector; - readonly IEqualityComparer comparer; - CancellationToken cancellationToken; - - ILookup lookup; - IUniTaskAsyncEnumerator enumerator; - TOuter outerValue; - UniTask.Awaiter awaiter; - UniTask.Awaiter outerKeyAwaiter; - UniTask.Awaiter resultAwaiter; - - - public _GroupJoinAwaitWithCancellation(IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func> outerKeySelector, Func> innerKeySelector, Func, CancellationToken, UniTask> resultSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - this.outer = outer; - this.inner = inner; - this.outerKeySelector = outerKeySelector; - this.innerKeySelector = innerKeySelector; - this.resultSelector = resultSelector; - this.comparer = comparer; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - completionSource.Reset(); - - if (lookup == null) - { - CreateLookup().Forget(); - } - else - { - SourceMoveNext(); - } - return new UniTask(this, completionSource.Version); - } - - async UniTaskVoid CreateLookup() - { - try - { - lookup = await inner.ToLookupAwaitWithCancellationAsync(innerKeySelector, comparer, cancellationToken); - enumerator = outer.GetAsyncEnumerator(cancellationToken); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - SourceMoveNext(); - } - - void SourceMoveNext() - { - try - { - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - MoveNextCore(this); - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - } - - static void MoveNextCore(object state) - { - var self = (_GroupJoinAwaitWithCancellation)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - try - { - - self.outerValue = self.enumerator.Current; - self.outerKeyAwaiter = self.outerKeySelector(self.outerValue, self.cancellationToken).GetAwaiter(); - if (self.outerKeyAwaiter.IsCompleted) - { - OuterKeySelectCore(self); - } - else - { - self.outerKeyAwaiter.SourceOnCompleted(OuterKeySelectCoreDelegate, self); - } - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - } - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - - static void OuterKeySelectCore(object state) - { - var self = (_GroupJoinAwaitWithCancellation)state; - - if (self.TryGetResult(self.outerKeyAwaiter, out var result)) - { - try - { - var values = self.lookup[result]; - self.resultAwaiter = self.resultSelector(self.outerValue, values, self.cancellationToken).GetAwaiter(); - if (self.resultAwaiter.IsCompleted) - { - ResultSelectCore(self); - } - else - { - self.resultAwaiter.SourceOnCompleted(ResultSelectCoreDelegate, self); - } - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - } - } - } - - static void ResultSelectCore(object state) - { - var self = (_GroupJoinAwaitWithCancellation)state; - - if (self.TryGetResult(self.resultAwaiter, out var result)) - { - self.Current = result; - self.completionSource.TrySetResult(true); - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/GroupJoin.cs.meta b/VirtueSky/UniTask/Runtime/Linq/GroupJoin.cs.meta deleted file mode 100644 index f171ed19..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/GroupJoin.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7bf7759d03bf3f64190d3ae83b182c2c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Intersect.cs b/VirtueSky/UniTask/Runtime/Linq/Intersect.cs deleted file mode 100644 index e21ec855..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Intersect.cs +++ /dev/null @@ -1,117 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Intersect(this IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second) - { - Error.ThrowArgumentNullException(first, nameof(first)); - Error.ThrowArgumentNullException(second, nameof(second)); - - return new Intersect(first, second, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable Intersect(this IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(first, nameof(first)); - Error.ThrowArgumentNullException(second, nameof(second)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new Intersect(first, second, comparer); - } - } - - internal sealed class Intersect : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable first; - readonly IUniTaskAsyncEnumerable second; - readonly IEqualityComparer comparer; - - public Intersect(IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, IEqualityComparer comparer) - { - this.first = first; - this.second = second; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Intersect(first, second, comparer, cancellationToken); - } - - class _Intersect : AsyncEnumeratorBase - { - static Action HashSetAsyncCoreDelegate = HashSetAsyncCore; - - readonly IEqualityComparer comparer; - readonly IUniTaskAsyncEnumerable second; - - HashSet set; - UniTask>.Awaiter awaiter; - - public _Intersect(IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, IEqualityComparer comparer, CancellationToken cancellationToken) - - : base(first, cancellationToken) - { - this.second = second; - this.comparer = comparer; - } - - protected override bool OnFirstIteration() - { - if (set != null) return false; - - awaiter = second.ToHashSetAsync(cancellationToken).GetAwaiter(); - if (awaiter.IsCompleted) - { - set = awaiter.GetResult(); - SourceMoveNext(); - } - else - { - awaiter.SourceOnCompleted(HashSetAsyncCoreDelegate, this); - } - - return true; - } - - static void HashSetAsyncCore(object state) - { - var self = (_Intersect)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - self.set = result; - self.SourceMoveNext(); - } - } - - protected override bool TryMoveNextCore(bool sourceHasCurrent, out bool result) - { - if (sourceHasCurrent) - { - var v = SourceCurrent; - - if (set.Remove(v)) - { - Current = v; - result = true; - return true; - } - else - { - result = default; - return false; - } - } - - result = false; - return true; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Intersect.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Intersect.cs.meta deleted file mode 100644 index 28cf8e30..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Intersect.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 93999a70f5d57134bbe971f3e988c4f2 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Join.cs b/VirtueSky/UniTask/Runtime/Linq/Join.cs deleted file mode 100644 index f76d9bdb..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Join.cs +++ /dev/null @@ -1,728 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Join(this IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func outerKeySelector, Func innerKeySelector, Func resultSelector) - { - Error.ThrowArgumentNullException(outer, nameof(outer)); - Error.ThrowArgumentNullException(inner, nameof(inner)); - Error.ThrowArgumentNullException(outerKeySelector, nameof(outerKeySelector)); - Error.ThrowArgumentNullException(innerKeySelector, nameof(innerKeySelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new Join(outer, inner, outerKeySelector, innerKeySelector, resultSelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable Join(this IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func outerKeySelector, Func innerKeySelector, Func resultSelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(outer, nameof(outer)); - Error.ThrowArgumentNullException(inner, nameof(inner)); - Error.ThrowArgumentNullException(outerKeySelector, nameof(outerKeySelector)); - Error.ThrowArgumentNullException(innerKeySelector, nameof(innerKeySelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new Join(outer, inner, outerKeySelector, innerKeySelector, resultSelector, comparer); - } - - public static IUniTaskAsyncEnumerable JoinAwait(this IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func> outerKeySelector, Func> innerKeySelector, Func> resultSelector) - { - Error.ThrowArgumentNullException(outer, nameof(outer)); - Error.ThrowArgumentNullException(inner, nameof(inner)); - Error.ThrowArgumentNullException(outerKeySelector, nameof(outerKeySelector)); - Error.ThrowArgumentNullException(innerKeySelector, nameof(innerKeySelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new JoinAwait(outer, inner, outerKeySelector, innerKeySelector, resultSelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable JoinAwait(this IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func> outerKeySelector, Func> innerKeySelector, Func> resultSelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(outer, nameof(outer)); - Error.ThrowArgumentNullException(inner, nameof(inner)); - Error.ThrowArgumentNullException(outerKeySelector, nameof(outerKeySelector)); - Error.ThrowArgumentNullException(innerKeySelector, nameof(innerKeySelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new JoinAwait(outer, inner, outerKeySelector, innerKeySelector, resultSelector, comparer); - } - - public static IUniTaskAsyncEnumerable JoinAwaitWithCancellation(this IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func> outerKeySelector, Func> innerKeySelector, Func> resultSelector) - { - Error.ThrowArgumentNullException(outer, nameof(outer)); - Error.ThrowArgumentNullException(inner, nameof(inner)); - Error.ThrowArgumentNullException(outerKeySelector, nameof(outerKeySelector)); - Error.ThrowArgumentNullException(innerKeySelector, nameof(innerKeySelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new JoinAwaitWithCancellation(outer, inner, outerKeySelector, innerKeySelector, resultSelector, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable JoinAwaitWithCancellation(this IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func> outerKeySelector, Func> innerKeySelector, Func> resultSelector, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(outer, nameof(outer)); - Error.ThrowArgumentNullException(inner, nameof(inner)); - Error.ThrowArgumentNullException(outerKeySelector, nameof(outerKeySelector)); - Error.ThrowArgumentNullException(innerKeySelector, nameof(innerKeySelector)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new JoinAwaitWithCancellation(outer, inner, outerKeySelector, innerKeySelector, resultSelector, comparer); - } - } - - internal sealed class Join : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable outer; - readonly IUniTaskAsyncEnumerable inner; - readonly Func outerKeySelector; - readonly Func innerKeySelector; - readonly Func resultSelector; - readonly IEqualityComparer comparer; - - public Join(IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func outerKeySelector, Func innerKeySelector, Func resultSelector, IEqualityComparer comparer) - { - this.outer = outer; - this.inner = inner; - this.outerKeySelector = outerKeySelector; - this.innerKeySelector = innerKeySelector; - this.resultSelector = resultSelector; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Join(outer, inner, outerKeySelector, innerKeySelector, resultSelector, comparer, cancellationToken); - } - - sealed class _Join : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action MoveNextCoreDelegate = MoveNextCore; - - readonly IUniTaskAsyncEnumerable outer; - readonly IUniTaskAsyncEnumerable inner; - readonly Func outerKeySelector; - readonly Func innerKeySelector; - readonly Func resultSelector; - readonly IEqualityComparer comparer; - CancellationToken cancellationToken; - - ILookup lookup; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - TOuter currentOuterValue; - IEnumerator valueEnumerator; - - bool continueNext; - - public _Join(IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func outerKeySelector, Func innerKeySelector, Func resultSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - this.outer = outer; - this.inner = inner; - this.outerKeySelector = outerKeySelector; - this.innerKeySelector = innerKeySelector; - this.resultSelector = resultSelector; - this.comparer = comparer; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - completionSource.Reset(); - - if (lookup == null) - { - CreateInnerHashSet().Forget(); - } - else - { - SourceMoveNext(); - } - return new UniTask(this, completionSource.Version); - } - - async UniTaskVoid CreateInnerHashSet() - { - try - { - lookup = await inner.ToLookupAsync(innerKeySelector, comparer, cancellationToken); - enumerator = outer.GetAsyncEnumerator(cancellationToken); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - SourceMoveNext(); - } - - void SourceMoveNext() - { - try - { - LOOP: - if (valueEnumerator != null) - { - if (valueEnumerator.MoveNext()) - { - Current = resultSelector(currentOuterValue, valueEnumerator.Current); - goto TRY_SET_RESULT_TRUE; - } - else - { - valueEnumerator.Dispose(); - valueEnumerator = null; - } - } - - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - continueNext = true; - MoveNextCore(this); - if (continueNext) - { - continueNext = false; - goto LOOP; // avoid recursive - } - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - - return; - - TRY_SET_RESULT_TRUE: - completionSource.TrySetResult(true); - } - - - static void MoveNextCore(object state) - { - var self = (_Join)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - self.currentOuterValue = self.enumerator.Current; - var key = self.outerKeySelector(self.currentOuterValue); - self.valueEnumerator = self.lookup[key].GetEnumerator(); - - if (self.continueNext) - { - return; - } - else - { - self.SourceMoveNext(); - } - } - else - { - self.continueNext = false; - self.completionSource.TrySetResult(false); - } - } - else - { - self.continueNext = false; - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (valueEnumerator != null) - { - valueEnumerator.Dispose(); - } - - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - - return default; - } - } - } - - internal sealed class JoinAwait : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable outer; - readonly IUniTaskAsyncEnumerable inner; - readonly Func> outerKeySelector; - readonly Func> innerKeySelector; - readonly Func> resultSelector; - readonly IEqualityComparer comparer; - - public JoinAwait(IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func> outerKeySelector, Func> innerKeySelector, Func> resultSelector, IEqualityComparer comparer) - { - this.outer = outer; - this.inner = inner; - this.outerKeySelector = outerKeySelector; - this.innerKeySelector = innerKeySelector; - this.resultSelector = resultSelector; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _JoinAwait(outer, inner, outerKeySelector, innerKeySelector, resultSelector, comparer, cancellationToken); - } - - sealed class _JoinAwait : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action MoveNextCoreDelegate = MoveNextCore; - static readonly Action OuterSelectCoreDelegate = OuterSelectCore; - static readonly Action ResultSelectCoreDelegate = ResultSelectCore; - - readonly IUniTaskAsyncEnumerable outer; - readonly IUniTaskAsyncEnumerable inner; - readonly Func> outerKeySelector; - readonly Func> innerKeySelector; - readonly Func> resultSelector; - readonly IEqualityComparer comparer; - CancellationToken cancellationToken; - - ILookup lookup; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - TOuter currentOuterValue; - IEnumerator valueEnumerator; - - UniTask.Awaiter resultAwaiter; - UniTask.Awaiter outerKeyAwaiter; - - bool continueNext; - - public _JoinAwait(IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func> outerKeySelector, Func> innerKeySelector, Func> resultSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - this.outer = outer; - this.inner = inner; - this.outerKeySelector = outerKeySelector; - this.innerKeySelector = innerKeySelector; - this.resultSelector = resultSelector; - this.comparer = comparer; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - completionSource.Reset(); - - if (lookup == null) - { - CreateInnerHashSet().Forget(); - } - else - { - SourceMoveNext(); - } - return new UniTask(this, completionSource.Version); - } - - async UniTaskVoid CreateInnerHashSet() - { - try - { - lookup = await inner.ToLookupAwaitAsync(innerKeySelector, comparer, cancellationToken); - enumerator = outer.GetAsyncEnumerator(cancellationToken); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - SourceMoveNext(); - } - - void SourceMoveNext() - { - try - { - LOOP: - if (valueEnumerator != null) - { - if (valueEnumerator.MoveNext()) - { - resultAwaiter = resultSelector(currentOuterValue, valueEnumerator.Current).GetAwaiter(); - if (resultAwaiter.IsCompleted) - { - ResultSelectCore(this); - } - else - { - resultAwaiter.SourceOnCompleted(ResultSelectCoreDelegate, this); - } - return; - } - else - { - valueEnumerator.Dispose(); - valueEnumerator = null; - } - } - - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - continueNext = true; - MoveNextCore(this); - if (continueNext) - { - continueNext = false; - goto LOOP; // avoid recursive - } - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - } - - - static void MoveNextCore(object state) - { - var self = (_JoinAwait)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - self.currentOuterValue = self.enumerator.Current; - - self.outerKeyAwaiter = self.outerKeySelector(self.currentOuterValue).GetAwaiter(); - - if (self.outerKeyAwaiter.IsCompleted) - { - OuterSelectCore(self); - } - else - { - self.continueNext = false; - self.outerKeyAwaiter.SourceOnCompleted(OuterSelectCoreDelegate, self); - } - } - else - { - self.continueNext = false; - self.completionSource.TrySetResult(false); - } - } - else - { - self.continueNext = false; - } - } - - static void OuterSelectCore(object state) - { - var self = (_JoinAwait)state; - - if (self.TryGetResult(self.outerKeyAwaiter, out var key)) - { - self.valueEnumerator = self.lookup[key].GetEnumerator(); - - if (self.continueNext) - { - return; - } - else - { - self.SourceMoveNext(); - } - } - else - { - self.continueNext = false; - } - } - - static void ResultSelectCore(object state) - { - var self = (_JoinAwait)state; - - if (self.TryGetResult(self.resultAwaiter, out var result)) - { - self.Current = result; - self.completionSource.TrySetResult(true); - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (valueEnumerator != null) - { - valueEnumerator.Dispose(); - } - - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - - return default; - } - } - } - - internal sealed class JoinAwaitWithCancellation : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable outer; - readonly IUniTaskAsyncEnumerable inner; - readonly Func> outerKeySelector; - readonly Func> innerKeySelector; - readonly Func> resultSelector; - readonly IEqualityComparer comparer; - - public JoinAwaitWithCancellation(IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func> outerKeySelector, Func> innerKeySelector, Func> resultSelector, IEqualityComparer comparer) - { - this.outer = outer; - this.inner = inner; - this.outerKeySelector = outerKeySelector; - this.innerKeySelector = innerKeySelector; - this.resultSelector = resultSelector; - this.comparer = comparer; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _JoinAwaitWithCancellation(outer, inner, outerKeySelector, innerKeySelector, resultSelector, comparer, cancellationToken); - } - - sealed class _JoinAwaitWithCancellation : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action MoveNextCoreDelegate = MoveNextCore; - static readonly Action OuterSelectCoreDelegate = OuterSelectCore; - static readonly Action ResultSelectCoreDelegate = ResultSelectCore; - - readonly IUniTaskAsyncEnumerable outer; - readonly IUniTaskAsyncEnumerable inner; - readonly Func> outerKeySelector; - readonly Func> innerKeySelector; - readonly Func> resultSelector; - readonly IEqualityComparer comparer; - CancellationToken cancellationToken; - - ILookup lookup; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - TOuter currentOuterValue; - IEnumerator valueEnumerator; - - UniTask.Awaiter resultAwaiter; - UniTask.Awaiter outerKeyAwaiter; - - bool continueNext; - - public _JoinAwaitWithCancellation(IUniTaskAsyncEnumerable outer, IUniTaskAsyncEnumerable inner, Func> outerKeySelector, Func> innerKeySelector, Func> resultSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - this.outer = outer; - this.inner = inner; - this.outerKeySelector = outerKeySelector; - this.innerKeySelector = innerKeySelector; - this.resultSelector = resultSelector; - this.comparer = comparer; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - completionSource.Reset(); - - if (lookup == null) - { - CreateInnerHashSet().Forget(); - } - else - { - SourceMoveNext(); - } - return new UniTask(this, completionSource.Version); - } - - async UniTaskVoid CreateInnerHashSet() - { - try - { - lookup = await inner.ToLookupAwaitWithCancellationAsync(innerKeySelector, comparer, cancellationToken: cancellationToken); - enumerator = outer.GetAsyncEnumerator(cancellationToken); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - SourceMoveNext(); - } - - void SourceMoveNext() - { - try - { - LOOP: - if (valueEnumerator != null) - { - if (valueEnumerator.MoveNext()) - { - resultAwaiter = resultSelector(currentOuterValue, valueEnumerator.Current, cancellationToken).GetAwaiter(); - if (resultAwaiter.IsCompleted) - { - ResultSelectCore(this); - } - else - { - resultAwaiter.SourceOnCompleted(ResultSelectCoreDelegate, this); - } - return; - } - else - { - valueEnumerator.Dispose(); - valueEnumerator = null; - } - } - - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - continueNext = true; - MoveNextCore(this); - if (continueNext) - { - continueNext = false; - goto LOOP; // avoid recursive - } - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - } - - - static void MoveNextCore(object state) - { - var self = (_JoinAwaitWithCancellation)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - self.currentOuterValue = self.enumerator.Current; - - self.outerKeyAwaiter = self.outerKeySelector(self.currentOuterValue, self.cancellationToken).GetAwaiter(); - - if (self.outerKeyAwaiter.IsCompleted) - { - OuterSelectCore(self); - } - else - { - self.continueNext = false; - self.outerKeyAwaiter.SourceOnCompleted(OuterSelectCoreDelegate, self); - } - } - else - { - self.continueNext = false; - self.completionSource.TrySetResult(false); - } - } - else - { - self.continueNext = false; - } - } - - static void OuterSelectCore(object state) - { - var self = (_JoinAwaitWithCancellation)state; - - if (self.TryGetResult(self.outerKeyAwaiter, out var key)) - { - self.valueEnumerator = self.lookup[key].GetEnumerator(); - - if (self.continueNext) - { - return; - } - else - { - self.SourceMoveNext(); - } - } - else - { - self.continueNext = false; - } - } - - static void ResultSelectCore(object state) - { - var self = (_JoinAwaitWithCancellation)state; - - if (self.TryGetResult(self.resultAwaiter, out var result)) - { - self.Current = result; - self.completionSource.TrySetResult(true); - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (valueEnumerator != null) - { - valueEnumerator.Dispose(); - } - - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - - return default; - } - } - } - -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Join.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Join.cs.meta deleted file mode 100644 index 3ab1015a..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Join.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: dc4ff8cb6d7c9a64896f2f082124d6b3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Last.cs b/VirtueSky/UniTask/Runtime/Linq/Last.cs deleted file mode 100644 index b0322ae6..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Last.cs +++ /dev/null @@ -1,240 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask LastAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Last.LastAsync(source, cancellationToken, false); - } - - public static UniTask LastAsync(this IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return Last.LastAsync(source, predicate, cancellationToken, false); - } - - public static UniTask LastAwaitAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return Last.LastAwaitAsync(source, predicate, cancellationToken, false); - } - - public static UniTask LastAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return Last.LastAwaitWithCancellationAsync(source, predicate, cancellationToken, false); - } - - public static UniTask LastOrDefaultAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Last.LastAsync(source, cancellationToken, true); - } - - public static UniTask LastOrDefaultAsync(this IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return Last.LastAsync(source, predicate, cancellationToken, true); - } - - public static UniTask LastOrDefaultAwaitAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return Last.LastAwaitAsync(source, predicate, cancellationToken, true); - } - - public static UniTask LastOrDefaultAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return Last.LastAwaitWithCancellationAsync(source, predicate, cancellationToken, true); - } - } - - internal static class Last - { - public static async UniTask LastAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken, bool defaultIfEmpty) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - TSource value = default; - if (await e.MoveNextAsync()) - { - value = e.Current; - } - else - { - if (defaultIfEmpty) - { - return value; - } - else - { - throw Error.NoElements(); - } - } - - while (await e.MoveNextAsync()) - { - value = e.Current; - } - return value; - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTask LastAsync(IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken, bool defaultIfEmpty) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - TSource value = default; - - bool found = false; - while (await e.MoveNextAsync()) - { - var v = e.Current; - if (predicate(v)) - { - found = true; - value = v; - } - } - - if (defaultIfEmpty) - { - return value; - } - else - { - if (found) - { - return value; - } - else - { - throw Error.NoElements(); - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTask LastAwaitAsync(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken, bool defaultIfEmpty) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - TSource value = default; - - bool found = false; - while (await e.MoveNextAsync()) - { - var v = e.Current; - if (await predicate(v)) - { - found = true; - value = v; - } - } - - if (defaultIfEmpty) - { - return value; - } - else - { - if (found) - { - return value; - } - else - { - throw Error.NoElements(); - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTask LastAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken, bool defaultIfEmpty) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - TSource value = default; - - bool found = false; - while (await e.MoveNextAsync()) - { - var v = e.Current; - if (await predicate(v, cancellationToken)) - { - found = true; - value = v; - } - } - - if (defaultIfEmpty) - { - return value; - } - else - { - if (found) - { - return value; - } - else - { - throw Error.NoElements(); - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Last.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Last.cs.meta deleted file mode 100644 index edfa124a..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Last.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a0ccc93be1387fa4a975f06310127c11 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/LongCount.cs b/VirtueSky/UniTask/Runtime/Linq/LongCount.cs deleted file mode 100644 index 4e414659..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/LongCount.cs +++ /dev/null @@ -1,144 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask LongCountAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return LongCount.LongCountAsync(source, cancellationToken); - } - - public static UniTask LongCountAsync(this IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return LongCount.LongCountAsync(source, predicate, cancellationToken); - } - - public static UniTask LongCountAwaitAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return LongCount.LongCountAwaitAsync(source, predicate, cancellationToken); - } - - public static UniTask LongCountAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return LongCount.LongCountAwaitWithCancellationAsync(source, predicate, cancellationToken); - } - } - - internal static class LongCount - { - internal static async UniTask LongCountAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - long count = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - checked { count++; } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return count; - } - - internal static async UniTask LongCountAsync(IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken) - { - long count = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - if (predicate(e.Current)) - { - checked { count++; } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return count; - } - - internal static async UniTask LongCountAwaitAsync(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - { - long count = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - if (await predicate(e.Current)) - { - checked { count++; } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return count; - } - - internal static async UniTask LongCountAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - { - long count = 0; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - if (await predicate(e.Current, cancellationToken)) - { - checked { count++; } - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return count; - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/LongCount.cs.meta b/VirtueSky/UniTask/Runtime/Linq/LongCount.cs.meta deleted file mode 100644 index 862c2bcf..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/LongCount.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 198b39e58ced3ab4f97ccbe0916787d5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Max.cs b/VirtueSky/UniTask/Runtime/Linq/Max.cs deleted file mode 100644 index 770478b6..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Max.cs +++ /dev/null @@ -1,200 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Max.MaxAsync(source, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitWithCancellationAsync(source, selector, cancellationToken); - } - } - - internal static partial class Max - { - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - TSource value = default; - var comparer = Comparer.Default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - - goto NEXT_LOOP; - } - - return value; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if (comparer.Compare(value, x) < 0) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - TResult value = default; - var comparer = Comparer.Default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - - goto NEXT_LOOP; - } - - return value; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if (comparer.Compare(value, x) < 0) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - TResult value = default; - var comparer = Comparer.Default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - - goto NEXT_LOOP; - } - - return value; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if (comparer.Compare(value, x) < 0) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - TResult value = default; - var comparer = Comparer.Default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - - goto NEXT_LOOP; - } - - return value; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if (comparer.Compare(value, x) < 0) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Max.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Max.cs.meta deleted file mode 100644 index 2125edf6..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Max.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5c8a118a6b664c441820b8a87d7f6e28 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Merge.cs b/VirtueSky/UniTask/Runtime/Linq/Merge.cs deleted file mode 100644 index ff504327..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Merge.cs +++ /dev/null @@ -1,234 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Merge(this IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second) - { - Error.ThrowArgumentNullException(first, nameof(first)); - Error.ThrowArgumentNullException(second, nameof(second)); - - return new Merge(new [] { first, second }); - } - - public static IUniTaskAsyncEnumerable Merge(this IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, IUniTaskAsyncEnumerable third) - { - Error.ThrowArgumentNullException(first, nameof(first)); - Error.ThrowArgumentNullException(second, nameof(second)); - Error.ThrowArgumentNullException(third, nameof(third)); - - return new Merge(new[] { first, second, third }); - } - - public static IUniTaskAsyncEnumerable Merge(this IEnumerable> sources) - { - return sources is IUniTaskAsyncEnumerable[] array - ? new Merge(array) - : new Merge(sources.ToArray()); - } - - public static IUniTaskAsyncEnumerable Merge(params IUniTaskAsyncEnumerable[] sources) - { - return new Merge(sources); - } - } - - internal sealed class Merge : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable[] sources; - - public Merge(IUniTaskAsyncEnumerable[] sources) - { - if (sources.Length <= 0) - { - Error.ThrowArgumentException("No source async enumerable to merge"); - } - this.sources = sources; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - => new _Merge(sources, cancellationToken); - - enum MergeSourceState - { - Pending, - Running, - Completed, - } - - sealed class _Merge : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action GetResultAtAction = GetResultAt; - - readonly int length; - readonly IUniTaskAsyncEnumerator[] enumerators; - readonly MergeSourceState[] states; - readonly Queue<(T, Exception, bool)> queuedResult = new Queue<(T, Exception, bool)>(); - readonly CancellationToken cancellationToken; - - int moveNextCompleted; - - public T Current { get; private set; } - - public _Merge(IUniTaskAsyncEnumerable[] sources, CancellationToken cancellationToken) - { - this.cancellationToken = cancellationToken; - length = sources.Length; - states = ArrayPool.Shared.Rent(length); - enumerators = ArrayPool>.Shared.Rent(length); - for (var i = 0; i < length; i++) - { - enumerators[i] = sources[i].GetAsyncEnumerator(cancellationToken); - states[i] = (int)MergeSourceState.Pending;; - } - } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - completionSource.Reset(); - Interlocked.Exchange(ref moveNextCompleted, 0); - - if (HasQueuedResult() && Interlocked.CompareExchange(ref moveNextCompleted, 1, 0) == 0) - { - (T, Exception, bool) value; - lock (states) - { - value = queuedResult.Dequeue(); - } - var resultValue = value.Item1; - var exception = value.Item2; - var hasNext = value.Item3; - if (exception != null) - { - completionSource.TrySetException(exception); - } - else - { - Current = resultValue; - completionSource.TrySetResult(hasNext); - } - return new UniTask(this, completionSource.Version); - } - - for (var i = 0; i < length; i++) - { - lock (states) - { - if (states[i] == MergeSourceState.Pending) - { - states[i] = MergeSourceState.Running; - } - else - { - continue; - } - } - var awaiter = enumerators[i].MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - GetResultAt(i, awaiter); - } - else - { - awaiter.SourceOnCompleted(GetResultAtAction, StateTuple.Create(this, i, awaiter)); - } - } - return new UniTask(this, completionSource.Version); - } - - public async UniTask DisposeAsync() - { - for (var i = 0; i < length; i++) - { - await enumerators[i].DisposeAsync(); - } - - ArrayPool.Shared.Return(states, true); - ArrayPool>.Shared.Return(enumerators, true); - } - - static void GetResultAt(object state) - { - using (var tuple = (StateTuple<_Merge, int, UniTask.Awaiter>)state) - { - tuple.Item1.GetResultAt(tuple.Item2, tuple.Item3); - } - } - - void GetResultAt(int index, UniTask.Awaiter awaiter) - { - bool hasNext; - bool completedAll; - try - { - hasNext = awaiter.GetResult(); - } - catch (Exception ex) - { - if (Interlocked.CompareExchange(ref moveNextCompleted, 1, 0) == 0) - { - completionSource.TrySetException(ex); - } - else - { - lock (states) - { - queuedResult.Enqueue((default, ex, default)); - } - } - return; - } - - lock (states) - { - states[index] = hasNext ? MergeSourceState.Pending : MergeSourceState.Completed; - completedAll = !hasNext && IsCompletedAll(); - } - if (hasNext || completedAll) - { - if (Interlocked.CompareExchange(ref moveNextCompleted, 1, 0) == 0) - { - Current = enumerators[index].Current; - completionSource.TrySetResult(!completedAll); - } - else - { - lock (states) - { - queuedResult.Enqueue((enumerators[index].Current, null, !completedAll)); - } - } - } - } - - bool HasQueuedResult() - { - lock (states) - { - return queuedResult.Count > 0; - } - } - - bool IsCompletedAll() - { - lock (states) - { - for (var i = 0; i < length; i++) - { - if (states[i] != MergeSourceState.Completed) - { - return false; - } - } - } - return true; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Merge.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Merge.cs.meta deleted file mode 100644 index 2f671f4c..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Merge.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: ca56812f160c45d0bacb4339819edf1a -timeCreated: 1694133666 \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Min.cs b/VirtueSky/UniTask/Runtime/Linq/Min.cs deleted file mode 100644 index ecc78a70..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Min.cs +++ /dev/null @@ -1,200 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Min.MinAsync(source, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitWithCancellationAsync(source, selector, cancellationToken); - } - } - - internal static partial class Min - { - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - TSource value = default; - var comparer = Comparer.Default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - - goto NEXT_LOOP; - } - - return value; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if (comparer.Compare(value, x) > 0) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - TResult value = default; - var comparer = Comparer.Default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - - goto NEXT_LOOP; - } - - return value; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if (comparer.Compare(value, x) > 0) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - TResult value = default; - var comparer = Comparer.Default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - - goto NEXT_LOOP; - } - - return value; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if (comparer.Compare(value, x) > 0) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - TResult value = default; - var comparer = Comparer.Default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - - goto NEXT_LOOP; - } - - return value; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if (comparer.Compare(value, x) > 0) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Min.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Min.cs.meta deleted file mode 100644 index 91378dc9..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Min.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 57ac9da21d3457849a8e45548290a508 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/MinMax.cs b/VirtueSky/UniTask/Runtime/Linq/MinMax.cs deleted file mode 100644 index 80c81c9e..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/MinMax.cs +++ /dev/null @@ -1,3763 +0,0 @@ -using System; -using System.Threading; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Min.MinAsync(source, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Min.MinAsync(source, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Min.MinAsync(source, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Min.MinAsync(source, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Min.MinAsync(source, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Min.MinAsync(source, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Min.MinAsync(source, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Min.MinAsync(source, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Min.MinAsync(source, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Min.MinAsync(source, cancellationToken); - } - - public static UniTask MinAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MinAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Min.MinAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - } - - internal static partial class Min - { - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Int32 value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Int32 value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int32 value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int32 value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Int64 value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Int64 value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int64 value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int64 value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Single value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Single value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Single value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Single value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Double value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Double value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Double value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Double value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Decimal value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Decimal value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Decimal value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Decimal value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Int32? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Int32? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int32? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int32? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Int64? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Int64? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int64? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int64? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Single? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Single? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Single? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Single? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Double? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Double? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Double? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Double? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Decimal? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Decimal? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Decimal? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MinAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Decimal? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if( x == null) continue; - if (value > x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - } - - public static partial class UniTaskAsyncEnumerable - { - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Max.MaxAsync(source, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Max.MaxAsync(source, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Max.MaxAsync(source, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Max.MaxAsync(source, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Max.MaxAsync(source, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Max.MaxAsync(source, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Max.MaxAsync(source, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Max.MaxAsync(source, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Max.MaxAsync(source, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Max.MaxAsync(source, cancellationToken); - } - - public static UniTask MaxAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask MaxAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Max.MaxAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - } - - internal static partial class Max - { - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Int32 value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Int32 value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int32 value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int32 value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Int64 value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Int64 value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int64 value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int64 value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Single value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Single value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Single value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Single value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Double value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Double value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Double value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Double value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Decimal value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Decimal value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Decimal value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Decimal value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - - goto NEXT_LOOP; - } - - throw Error.NoElements(); - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Int32? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Int32? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int32? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int32? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Int64? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Int64? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int64? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int64? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Single? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Single? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Single? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Single? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Double? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Double? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Double? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Double? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Decimal? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = e.Current; - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = e.Current; - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Decimal? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = selector(e.Current); - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Decimal? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current); - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - public static async UniTask MaxAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Decimal? value = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - value = await selector(e.Current, cancellationToken); - if(value == null) continue; - - goto NEXT_LOOP; - } - - return default; - - NEXT_LOOP: - - while (await e.MoveNextAsync()) - { - var x = await selector(e.Current, cancellationToken); - if( x == null) continue; - if (value < x) - { - value = x; - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return value; - } - - } - -} diff --git a/VirtueSky/UniTask/Runtime/Linq/MinMax.cs.meta b/VirtueSky/UniTask/Runtime/Linq/MinMax.cs.meta deleted file mode 100644 index 3856b65f..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/MinMax.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2d6da02d9ab970e4999daf7147d98e36 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Never.cs b/VirtueSky/UniTask/Runtime/Linq/Never.cs deleted file mode 100644 index 6141505e..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Never.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Never() - { - return VirtueSky.Threading.Tasks.Linq.Never.Instance; - } - } - - internal class Never : IUniTaskAsyncEnumerable - { - public static readonly IUniTaskAsyncEnumerable Instance = new Never(); - - Never() - { - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Never(cancellationToken); - } - - class _Never : IUniTaskAsyncEnumerator - { - CancellationToken cancellationToken; - - public _Never(CancellationToken cancellationToken) - { - this.cancellationToken = cancellationToken; - } - - public T Current => default; - - public UniTask MoveNextAsync() - { - var tcs = new UniTaskCompletionSource(); - - cancellationToken.Register(state => - { - var task = (UniTaskCompletionSource)state; - task.TrySetCanceled(cancellationToken); - }, tcs); - - return tcs.Task; - } - - public UniTask DisposeAsync() - { - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Never.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Never.cs.meta deleted file mode 100644 index ba9d358c..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Never.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8b307c3d3be71a94da251564bcdefa3d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/OfType.cs b/VirtueSky/UniTask/Runtime/Linq/OfType.cs deleted file mode 100644 index 3fa78e4b..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/OfType.cs +++ /dev/null @@ -1,61 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable OfType(this IUniTaskAsyncEnumerable source) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return new OfType(source); - } - } - - internal sealed class OfType : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - - public OfType(IUniTaskAsyncEnumerable source) - { - this.source = source; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _OfType(source, cancellationToken); - } - - class _OfType : AsyncEnumeratorBase - { - public _OfType(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - - : base(source, cancellationToken) - { - } - - protected override bool TryMoveNextCore(bool sourceHasCurrent, out bool result) - { - if (sourceHasCurrent) - { - if (SourceCurrent is TResult castCurent) - { - Current = castCurent; - result = true; - return true; - } - else - { - result = default; - return false; - } - } - - result = false; - return true; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/OfType.cs.meta b/VirtueSky/UniTask/Runtime/Linq/OfType.cs.meta deleted file mode 100644 index 6ace53fd..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/OfType.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 111ffe87a7d700442a9ef5af554b252c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/OrderBy.cs b/VirtueSky/UniTask/Runtime/Linq/OrderBy.cs deleted file mode 100644 index 58bd7388..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/OrderBy.cs +++ /dev/null @@ -1,558 +0,0 @@ -using VirtueSky.Threading.Tasks; -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - #region OrderBy_OrderByDescending - - public static IUniTaskOrderedAsyncEnumerable OrderBy(this IUniTaskAsyncEnumerable source, Func keySelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - - return new OrderedAsyncEnumerable(source, keySelector, Comparer.Default, false, null); - } - - public static IUniTaskOrderedAsyncEnumerable OrderBy(this IUniTaskAsyncEnumerable source, Func keySelector, IComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new OrderedAsyncEnumerable(source, keySelector, comparer, false, null); - } - - public static IUniTaskOrderedAsyncEnumerable OrderByAwait(this IUniTaskAsyncEnumerable source, Func> keySelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - - return new OrderedAsyncEnumerableAwait(source, keySelector, Comparer.Default, false, null); - } - - public static IUniTaskOrderedAsyncEnumerable OrderByAwait(this IUniTaskAsyncEnumerable source, Func> keySelector, IComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new OrderedAsyncEnumerableAwait(source, keySelector, comparer, false, null); - } - - public static IUniTaskOrderedAsyncEnumerable OrderByAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> keySelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - - return new OrderedAsyncEnumerableAwaitWithCancellation(source, keySelector, Comparer.Default, false, null); - } - - public static IUniTaskOrderedAsyncEnumerable OrderByAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> keySelector, IComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new OrderedAsyncEnumerableAwaitWithCancellation(source, keySelector, comparer, false, null); - } - - public static IUniTaskOrderedAsyncEnumerable OrderByDescending(this IUniTaskAsyncEnumerable source, Func keySelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - - return new OrderedAsyncEnumerable(source, keySelector, Comparer.Default, true, null); - } - - public static IUniTaskOrderedAsyncEnumerable OrderByDescending(this IUniTaskAsyncEnumerable source, Func keySelector, IComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new OrderedAsyncEnumerable(source, keySelector, comparer, true, null); - } - - public static IUniTaskOrderedAsyncEnumerable OrderByDescendingAwait(this IUniTaskAsyncEnumerable source, Func> keySelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - - return new OrderedAsyncEnumerableAwait(source, keySelector, Comparer.Default, true, null); - } - - public static IUniTaskOrderedAsyncEnumerable OrderByDescendingAwait(this IUniTaskAsyncEnumerable source, Func> keySelector, IComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new OrderedAsyncEnumerableAwait(source, keySelector, comparer, true, null); - } - - public static IUniTaskOrderedAsyncEnumerable OrderByDescendingAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> keySelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - - return new OrderedAsyncEnumerableAwaitWithCancellation(source, keySelector, Comparer.Default, true, null); - } - - public static IUniTaskOrderedAsyncEnumerable OrderByDescendingAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> keySelector, IComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return new OrderedAsyncEnumerableAwaitWithCancellation(source, keySelector, comparer, true, null); - } - - #endregion - - #region ThenBy_ThenByDescending - - public static IUniTaskOrderedAsyncEnumerable ThenBy(this IUniTaskOrderedAsyncEnumerable source, Func keySelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - - return source.CreateOrderedEnumerable(keySelector, Comparer.Default, false); - } - - public static IUniTaskOrderedAsyncEnumerable ThenBy(this IUniTaskOrderedAsyncEnumerable source, Func keySelector, IComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return source.CreateOrderedEnumerable(keySelector, comparer, false); - } - - public static IUniTaskOrderedAsyncEnumerable ThenByAwait(this IUniTaskOrderedAsyncEnumerable source, Func> keySelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - - return source.CreateOrderedEnumerable(keySelector, Comparer.Default, false); - } - - public static IUniTaskOrderedAsyncEnumerable ThenByAwait(this IUniTaskOrderedAsyncEnumerable source, Func> keySelector, IComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return source.CreateOrderedEnumerable(keySelector, comparer, false); - } - - public static IUniTaskOrderedAsyncEnumerable ThenByAwaitWithCancellation(this IUniTaskOrderedAsyncEnumerable source, Func> keySelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - - return source.CreateOrderedEnumerable(keySelector, Comparer.Default, false); - } - - public static IUniTaskOrderedAsyncEnumerable ThenByAwaitWithCancellation(this IUniTaskOrderedAsyncEnumerable source, Func> keySelector, IComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return source.CreateOrderedEnumerable(keySelector, comparer, false); - } - - public static IUniTaskOrderedAsyncEnumerable ThenByDescending(this IUniTaskOrderedAsyncEnumerable source, Func keySelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - - return source.CreateOrderedEnumerable(keySelector, Comparer.Default, true); - } - - public static IUniTaskOrderedAsyncEnumerable ThenByDescending(this IUniTaskOrderedAsyncEnumerable source, Func keySelector, IComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return source.CreateOrderedEnumerable(keySelector, comparer, true); - } - - public static IUniTaskOrderedAsyncEnumerable ThenByDescendingAwait(this IUniTaskOrderedAsyncEnumerable source, Func> keySelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - - return source.CreateOrderedEnumerable(keySelector, Comparer.Default, true); - } - - public static IUniTaskOrderedAsyncEnumerable ThenByDescendingAwait(this IUniTaskOrderedAsyncEnumerable source, Func> keySelector, IComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return source.CreateOrderedEnumerable(keySelector, comparer, true); - } - - public static IUniTaskOrderedAsyncEnumerable ThenByDescendingAwaitWithCancellation(this IUniTaskOrderedAsyncEnumerable source, Func> keySelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - - return source.CreateOrderedEnumerable(keySelector, Comparer.Default, true); - } - - public static IUniTaskOrderedAsyncEnumerable ThenByDescendingAwaitWithCancellation(this IUniTaskOrderedAsyncEnumerable source, Func> keySelector, IComparer comparer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return source.CreateOrderedEnumerable(keySelector, comparer, true); - } - - #endregion - } - - internal abstract class AsyncEnumerableSorter - { - internal abstract UniTask ComputeKeysAsync(TElement[] elements, int count); - - internal abstract int CompareKeys(int index1, int index2); - - internal async UniTask SortAsync(TElement[] elements, int count) - { - await ComputeKeysAsync(elements, count); - - int[] map = new int[count]; - for (int i = 0; i < count; i++) map[i] = i; - QuickSort(map, 0, count - 1); - return map; - } - - void QuickSort(int[] map, int left, int right) - { - do - { - int i = left; - int j = right; - int x = map[i + ((j - i) >> 1)]; - do - { - while (i < map.Length && CompareKeys(x, map[i]) > 0) i++; - while (j >= 0 && CompareKeys(x, map[j]) < 0) j--; - if (i > j) break; - if (i < j) - { - int temp = map[i]; - map[i] = map[j]; - map[j] = temp; - } - i++; - j--; - } while (i <= j); - if (j - left <= right - i) - { - if (left < j) QuickSort(map, left, j); - left = i; - } - else - { - if (i < right) QuickSort(map, i, right); - right = j; - } - } while (left < right); - } - } - - internal class SyncSelectorAsyncEnumerableSorter : AsyncEnumerableSorter - { - readonly Func keySelector; - readonly IComparer comparer; - readonly bool descending; - readonly AsyncEnumerableSorter next; - TKey[] keys; - - internal SyncSelectorAsyncEnumerableSorter(Func keySelector, IComparer comparer, bool descending, AsyncEnumerableSorter next) - { - this.keySelector = keySelector; - this.comparer = comparer; - this.descending = descending; - this.next = next; - } - - internal override async UniTask ComputeKeysAsync(TElement[] elements, int count) - { - keys = new TKey[count]; - for (int i = 0; i < count; i++) keys[i] = keySelector(elements[i]); - if (next != null) await next.ComputeKeysAsync(elements, count); - } - - internal override int CompareKeys(int index1, int index2) - { - int c = comparer.Compare(keys[index1], keys[index2]); - if (c == 0) - { - if (next == null) return index1 - index2; - return next.CompareKeys(index1, index2); - } - return descending ? -c : c; - } - } - - internal class AsyncSelectorEnumerableSorter : AsyncEnumerableSorter - { - readonly Func> keySelector; - readonly IComparer comparer; - readonly bool descending; - readonly AsyncEnumerableSorter next; - TKey[] keys; - - internal AsyncSelectorEnumerableSorter(Func> keySelector, IComparer comparer, bool descending, AsyncEnumerableSorter next) - { - this.keySelector = keySelector; - this.comparer = comparer; - this.descending = descending; - this.next = next; - } - - internal override async UniTask ComputeKeysAsync(TElement[] elements, int count) - { - keys = new TKey[count]; - for (int i = 0; i < count; i++) keys[i] = await keySelector(elements[i]); - if (next != null) await next.ComputeKeysAsync(elements, count); - } - - internal override int CompareKeys(int index1, int index2) - { - int c = comparer.Compare(keys[index1], keys[index2]); - if (c == 0) - { - if (next == null) return index1 - index2; - return next.CompareKeys(index1, index2); - } - return descending ? -c : c; - } - } - - internal class AsyncSelectorWithCancellationEnumerableSorter : AsyncEnumerableSorter - { - readonly Func> keySelector; - readonly IComparer comparer; - readonly bool descending; - readonly AsyncEnumerableSorter next; - CancellationToken cancellationToken; - TKey[] keys; - - internal AsyncSelectorWithCancellationEnumerableSorter(Func> keySelector, IComparer comparer, bool descending, AsyncEnumerableSorter next, CancellationToken cancellationToken) - { - this.keySelector = keySelector; - this.comparer = comparer; - this.descending = descending; - this.next = next; - this.cancellationToken = cancellationToken; - } - - internal override async UniTask ComputeKeysAsync(TElement[] elements, int count) - { - keys = new TKey[count]; - for (int i = 0; i < count; i++) keys[i] = await keySelector(elements[i], cancellationToken); - if (next != null) await next.ComputeKeysAsync(elements, count); - } - - internal override int CompareKeys(int index1, int index2) - { - int c = comparer.Compare(keys[index1], keys[index2]); - if (c == 0) - { - if (next == null) return index1 - index2; - return next.CompareKeys(index1, index2); - } - return descending ? -c : c; - } - } - - internal abstract class OrderedAsyncEnumerable : IUniTaskOrderedAsyncEnumerable - { - protected readonly IUniTaskAsyncEnumerable source; - - public OrderedAsyncEnumerable(IUniTaskAsyncEnumerable source) - { - this.source = source; - } - - public IUniTaskOrderedAsyncEnumerable CreateOrderedEnumerable(Func keySelector, IComparer comparer, bool descending) - { - return new OrderedAsyncEnumerable(source, keySelector, comparer, descending, this); - } - - public IUniTaskOrderedAsyncEnumerable CreateOrderedEnumerable(Func> keySelector, IComparer comparer, bool descending) - { - return new OrderedAsyncEnumerableAwait(source, keySelector, comparer, descending, this); - } - - public IUniTaskOrderedAsyncEnumerable CreateOrderedEnumerable(Func> keySelector, IComparer comparer, bool descending) - { - return new OrderedAsyncEnumerableAwaitWithCancellation(source, keySelector, comparer, descending, this); - } - - internal abstract AsyncEnumerableSorter GetAsyncEnumerableSorter(AsyncEnumerableSorter next, CancellationToken cancellationToken); - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _OrderedAsyncEnumerator(this, cancellationToken); - } - - class _OrderedAsyncEnumerator : MoveNextSource, IUniTaskAsyncEnumerator - { - protected readonly OrderedAsyncEnumerable parent; - CancellationToken cancellationToken; - TElement[] buffer; - int[] map; - int index; - - public _OrderedAsyncEnumerator(OrderedAsyncEnumerable parent, CancellationToken cancellationToken) - { - this.parent = parent; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TElement Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - - if (map == null) - { - completionSource.Reset(); - CreateSortSource().Forget(); - return new UniTask(this, completionSource.Version); - } - - if (index < buffer.Length) - { - Current = buffer[map[index++]]; - return CompletedTasks.True; - } - else - { - return CompletedTasks.False; - } - } - - async UniTaskVoid CreateSortSource() - { - try - { - buffer = await parent.source.ToArrayAsync(); - if (buffer.Length == 0) - { - completionSource.TrySetResult(false); - return; - } - - var sorter = parent.GetAsyncEnumerableSorter(null, cancellationToken); - map = await sorter.SortAsync(buffer, buffer.Length); - sorter = null; - - // set first value - Current = buffer[map[index++]]; - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - - completionSource.TrySetResult(true); - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - return default; - } - } - } - - internal class OrderedAsyncEnumerable : OrderedAsyncEnumerable - { - readonly Func keySelector; - readonly IComparer comparer; - readonly bool descending; - readonly OrderedAsyncEnumerable parent; - - public OrderedAsyncEnumerable(IUniTaskAsyncEnumerable source, Func keySelector, IComparer comparer, bool descending, OrderedAsyncEnumerable parent) - : base(source) - { - this.keySelector = keySelector; - this.comparer = comparer; - this.descending = descending; - this.parent = parent; - } - - internal override AsyncEnumerableSorter GetAsyncEnumerableSorter(AsyncEnumerableSorter next, CancellationToken cancellationToken) - { - AsyncEnumerableSorter sorter = new SyncSelectorAsyncEnumerableSorter(keySelector, comparer, descending, next); - if (parent != null) sorter = parent.GetAsyncEnumerableSorter(sorter, cancellationToken); - return sorter; - } - } - - internal class OrderedAsyncEnumerableAwait : OrderedAsyncEnumerable - { - readonly Func> keySelector; - readonly IComparer comparer; - readonly bool descending; - readonly OrderedAsyncEnumerable parent; - - public OrderedAsyncEnumerableAwait(IUniTaskAsyncEnumerable source, Func> keySelector, IComparer comparer, bool descending, OrderedAsyncEnumerable parent) - : base(source) - { - this.keySelector = keySelector; - this.comparer = comparer; - this.descending = descending; - this.parent = parent; - } - - internal override AsyncEnumerableSorter GetAsyncEnumerableSorter(AsyncEnumerableSorter next, CancellationToken cancellationToken) - { - AsyncEnumerableSorter sorter = new AsyncSelectorEnumerableSorter(keySelector, comparer, descending, next); - if (parent != null) sorter = parent.GetAsyncEnumerableSorter(sorter, cancellationToken); - return sorter; - } - } - - internal class OrderedAsyncEnumerableAwaitWithCancellation : OrderedAsyncEnumerable - { - readonly Func> keySelector; - readonly IComparer comparer; - readonly bool descending; - readonly OrderedAsyncEnumerable parent; - - public OrderedAsyncEnumerableAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> keySelector, IComparer comparer, bool descending, OrderedAsyncEnumerable parent) - : base(source) - { - this.keySelector = keySelector; - this.comparer = comparer; - this.descending = descending; - this.parent = parent; - } - - internal override AsyncEnumerableSorter GetAsyncEnumerableSorter(AsyncEnumerableSorter next, CancellationToken cancellationToken) - { - AsyncEnumerableSorter sorter = new AsyncSelectorWithCancellationEnumerableSorter(keySelector, comparer, descending, next, cancellationToken); - if (parent != null) sorter = parent.GetAsyncEnumerableSorter(sorter, cancellationToken); - return sorter; - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/OrderBy.cs.meta b/VirtueSky/UniTask/Runtime/Linq/OrderBy.cs.meta deleted file mode 100644 index 5c6b3e4a..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/OrderBy.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 413883ceff8546143bdf200aafa4b8f7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Pairwise.cs b/VirtueSky/UniTask/Runtime/Linq/Pairwise.cs deleted file mode 100644 index aa6f2466..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Pairwise.cs +++ /dev/null @@ -1,128 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable<(TSource, TSource)> Pairwise(this IUniTaskAsyncEnumerable source) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return new Pairwise(source); - } - } - - internal sealed class Pairwise : IUniTaskAsyncEnumerable<(TSource, TSource)> - { - readonly IUniTaskAsyncEnumerable source; - - public Pairwise(IUniTaskAsyncEnumerable source) - { - this.source = source; - } - - public IUniTaskAsyncEnumerator<(TSource, TSource)> GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Pairwise(source, cancellationToken); - } - - sealed class _Pairwise : MoveNextSource, IUniTaskAsyncEnumerator<(TSource, TSource)> - { - static readonly Action MoveNextCoreDelegate = MoveNextCore; - - readonly IUniTaskAsyncEnumerable source; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - - TSource prev; - bool isFirst; - - public _Pairwise(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - this.source = source; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public (TSource, TSource) Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - - if (enumerator == null) - { - isFirst = true; - enumerator = source.GetAsyncEnumerator(cancellationToken); - } - - completionSource.Reset(); - SourceMoveNext(); - return new UniTask(this, completionSource.Version); - } - - void SourceMoveNext() - { - try - { - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - MoveNextCore(this); - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - } - - static void MoveNextCore(object state) - { - var self = (_Pairwise)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - if (self.isFirst) - { - self.isFirst = false; - self.prev = self.enumerator.Current; - self.SourceMoveNext(); // run again. okay to use recursive(only one more). - } - else - { - var p = self.prev; - self.prev = self.enumerator.Current; - self.Current = (p, self.prev); - self.completionSource.TrySetResult(true); - } - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Pairwise.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Pairwise.cs.meta deleted file mode 100644 index 727b8cf4..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Pairwise.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: cddbf051d2a88f549986c468b23214af -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Publish.cs b/VirtueSky/UniTask/Runtime/Linq/Publish.cs deleted file mode 100644 index ec4f1a4e..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Publish.cs +++ /dev/null @@ -1,173 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IConnectableUniTaskAsyncEnumerable Publish(this IUniTaskAsyncEnumerable source) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return new Publish(source); - } - } - - internal sealed class Publish : IConnectableUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly CancellationTokenSource cancellationTokenSource; - - TriggerEvent trigger; - IUniTaskAsyncEnumerator enumerator; - IDisposable connectedDisposable; - bool isCompleted; - - public Publish(IUniTaskAsyncEnumerable source) - { - this.source = source; - this.cancellationTokenSource = new CancellationTokenSource(); - } - - public IDisposable Connect() - { - if (connectedDisposable != null) return connectedDisposable; - - if (enumerator == null) - { - enumerator = source.GetAsyncEnumerator(cancellationTokenSource.Token); - } - - ConsumeEnumerator().Forget(); - - connectedDisposable = new ConnectDisposable(cancellationTokenSource); - return connectedDisposable; - } - - async UniTaskVoid ConsumeEnumerator() - { - try - { - try - { - while (await enumerator.MoveNextAsync()) - { - trigger.SetResult(enumerator.Current); - } - trigger.SetCompleted(); - } - catch (Exception ex) - { - trigger.SetError(ex); - } - } - finally - { - isCompleted = true; - await enumerator.DisposeAsync(); - } - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Publish(this, cancellationToken); - } - - sealed class ConnectDisposable : IDisposable - { - readonly CancellationTokenSource cancellationTokenSource; - - public ConnectDisposable(CancellationTokenSource cancellationTokenSource) - { - this.cancellationTokenSource = cancellationTokenSource; - } - - public void Dispose() - { - this.cancellationTokenSource.Cancel(); - } - } - - sealed class _Publish : MoveNextSource, IUniTaskAsyncEnumerator, ITriggerHandler - { - static readonly Action CancelDelegate = OnCanceled; - - readonly Publish parent; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool isDisposed; - - public _Publish(Publish parent, CancellationToken cancellationToken) - { - if (cancellationToken.IsCancellationRequested) return; - - this.parent = parent; - this.cancellationToken = cancellationToken; - - if (cancellationToken.CanBeCanceled) - { - this.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(CancelDelegate, this); - } - - parent.trigger.Add(this); - TaskTracker.TrackActiveTask(this, 3); - } - - public TSource Current { get; private set; } - ITriggerHandler ITriggerHandler.Prev { get; set; } - ITriggerHandler ITriggerHandler.Next { get; set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - - if (parent.isCompleted) return CompletedTasks.False; - - completionSource.Reset(); - return new UniTask(this, completionSource.Version); - } - - static void OnCanceled(object state) - { - var self = (_Publish)state; - self.completionSource.TrySetCanceled(self.cancellationToken); - self.DisposeAsync().Forget(); - } - - public UniTask DisposeAsync() - { - if (!isDisposed) - { - isDisposed = true; - TaskTracker.RemoveTracking(this); - cancellationTokenRegistration.Dispose(); - parent.trigger.Remove(this); - } - - return default; - } - - public void OnNext(TSource value) - { - Current = value; - completionSource.TrySetResult(true); - } - - public void OnCanceled(CancellationToken cancellationToken) - { - completionSource.TrySetCanceled(cancellationToken); - } - - public void OnCompleted() - { - completionSource.TrySetResult(false); - } - - public void OnError(Exception ex) - { - completionSource.TrySetException(ex); - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Publish.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Publish.cs.meta deleted file mode 100644 index f3a81ba3..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Publish.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 93c684d1e88c09d4e89b79437d97b810 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Queue.cs b/VirtueSky/UniTask/Runtime/Linq/Queue.cs deleted file mode 100644 index a04b429d..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Queue.cs +++ /dev/null @@ -1,103 +0,0 @@ -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Queue(this IUniTaskAsyncEnumerable source) - { - return new QueueOperator(source); - } - } - - internal sealed class QueueOperator : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - - public QueueOperator(IUniTaskAsyncEnumerable source) - { - this.source = source; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Queue(source, cancellationToken); - } - - sealed class _Queue : IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - CancellationToken cancellationToken; - - Channel channel; - IUniTaskAsyncEnumerator channelEnumerator; - IUniTaskAsyncEnumerator sourceEnumerator; - bool channelClosed; - - public _Queue(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - this.source = source; - this.cancellationToken = cancellationToken; - } - - public TSource Current => channelEnumerator.Current; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - - if (sourceEnumerator == null) - { - sourceEnumerator = source.GetAsyncEnumerator(cancellationToken); - channel = Channel.CreateSingleConsumerUnbounded(); - - channelEnumerator = channel.Reader.ReadAllAsync().GetAsyncEnumerator(cancellationToken); - - ConsumeAll(this, sourceEnumerator, channel).Forget(); - } - - return channelEnumerator.MoveNextAsync(); - } - - static async UniTaskVoid ConsumeAll(_Queue self, IUniTaskAsyncEnumerator enumerator, ChannelWriter writer) - { - try - { - while (await enumerator.MoveNextAsync()) - { - writer.TryWrite(enumerator.Current); - } - writer.TryComplete(); - } - catch (Exception ex) - { - writer.TryComplete(ex); - } - finally - { - self.channelClosed = true; - await enumerator.DisposeAsync(); - } - } - - public async UniTask DisposeAsync() - { - if (sourceEnumerator != null) - { - await sourceEnumerator.DisposeAsync(); - } - if (channelEnumerator != null) - { - await channelEnumerator.DisposeAsync(); - } - - if (!channelClosed) - { - channelClosed = true; - channel.Writer.TryComplete(new OperationCanceledException()); - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Queue.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Queue.cs.meta deleted file mode 100644 index 35f3fab2..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Queue.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b7ea1bcf9dbebb042bc99c7816249e02 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Range.cs b/VirtueSky/UniTask/Runtime/Linq/Range.cs deleted file mode 100644 index de7acce5..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Range.cs +++ /dev/null @@ -1,75 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Range(int start, int count) - { - if (count < 0) throw Error.ArgumentOutOfRange(nameof(count)); - - var end = (long)start + count - 1L; - if (end > int.MaxValue) throw Error.ArgumentOutOfRange(nameof(count)); - - if (count == 0) UniTaskAsyncEnumerable.Empty(); - - return new VirtueSky.Threading.Tasks.Linq.Range(start, count); - } - } - - internal class Range : IUniTaskAsyncEnumerable - { - readonly int start; - readonly int end; - - public Range(int start, int count) - { - this.start = start; - this.end = start + count; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Range(start, end, cancellationToken); - } - - class _Range : IUniTaskAsyncEnumerator - { - readonly int start; - readonly int end; - int current; - CancellationToken cancellationToken; - - public _Range(int start, int end, CancellationToken cancellationToken) - { - this.start = start; - this.end = end; - this.cancellationToken = cancellationToken; - - this.current = start - 1; - } - - public int Current => current; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - - current++; - - if (current != end) - { - return CompletedTasks.True; - } - - return CompletedTasks.False; - } - - public UniTask DisposeAsync() - { - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Range.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Range.cs.meta deleted file mode 100644 index 36272fcf..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Range.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d826418a813498648b10542d0a5fb173 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Repeat.cs b/VirtueSky/UniTask/Runtime/Linq/Repeat.cs deleted file mode 100644 index eb179502..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Repeat.cs +++ /dev/null @@ -1,68 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Repeat(TElement element, int count) - { - if (count < 0) throw Error.ArgumentOutOfRange(nameof(count)); - - return new Repeat(element, count); - } - } - - internal class Repeat : IUniTaskAsyncEnumerable - { - readonly TElement element; - readonly int count; - - public Repeat(TElement element, int count) - { - this.element = element; - this.count = count; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Repeat(element, count, cancellationToken); - } - - class _Repeat : IUniTaskAsyncEnumerator - { - readonly TElement element; - readonly int count; - int remaining; - CancellationToken cancellationToken; - - public _Repeat(TElement element, int count, CancellationToken cancellationToken) - { - this.element = element; - this.count = count; - this.cancellationToken = cancellationToken; - - this.remaining = count; - } - - public TElement Current => element; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - - if (remaining-- != 0) - { - return CompletedTasks.True; - } - - return CompletedTasks.False; - } - - public UniTask DisposeAsync() - { - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Repeat.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Repeat.cs.meta deleted file mode 100644 index 693d5790..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Repeat.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3819a3925165a674d80ee848c8600379 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Return.cs b/VirtueSky/UniTask/Runtime/Linq/Return.cs deleted file mode 100644 index c9c8f190..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Return.cs +++ /dev/null @@ -1,63 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Return(TValue value) - { - return new Return(value); - } - } - - internal class Return : IUniTaskAsyncEnumerable - { - readonly TValue value; - - public Return(TValue value) - { - this.value = value; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Return(value, cancellationToken); - } - - class _Return : IUniTaskAsyncEnumerator - { - readonly TValue value; - CancellationToken cancellationToken; - - bool called; - - public _Return(TValue value, CancellationToken cancellationToken) - { - this.value = value; - this.cancellationToken = cancellationToken; - this.called = false; - } - - public TValue Current => value; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - - if (!called) - { - called = true; - return CompletedTasks.True; - } - - return CompletedTasks.False; - } - - public UniTask DisposeAsync() - { - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Return.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Return.cs.meta deleted file mode 100644 index ad264d0d..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Return.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4313cd8ecf705e44f9064ce46e293c2c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Reverse.cs b/VirtueSky/UniTask/Runtime/Linq/Reverse.cs deleted file mode 100644 index a9a6e19d..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Reverse.cs +++ /dev/null @@ -1,78 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System.Collections.Generic; -using System.Linq; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Reverse(this IUniTaskAsyncEnumerable source) - { - Error.ThrowArgumentNullException(source, nameof(source)); - return new Reverse(source); - } - } - - internal sealed class Reverse : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - - public Reverse(IUniTaskAsyncEnumerable source) - { - this.source = source; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Reverse(source, cancellationToken); - } - - sealed class _Reverse : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - CancellationToken cancellationToken; - - TSource[] array; - int index; - - public _Reverse(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - this.source = source; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TSource Current { get; private set; } - - // after consumed array, don't use await so allow async(not require UniTaskCompletionSourceCore). - public async UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - - if (array == null) - { - array = await source.ToArrayAsync(cancellationToken); - index = array.Length - 1; - } - - if (index != -1) - { - Current = array[index]; - --index; - return true; - } - else - { - return false; - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Reverse.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Reverse.cs.meta deleted file mode 100644 index 4a28306a..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Reverse.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b2769e65c729b4f4ca6af9826d9c7b90 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Select.cs b/VirtueSky/UniTask/Runtime/Linq/Select.cs deleted file mode 100644 index da8f688b..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Select.cs +++ /dev/null @@ -1,760 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Select(this IUniTaskAsyncEnumerable source, Func selector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(selector, nameof(selector)); - - return new VirtueSky.Threading.Tasks.Linq.Select(source, selector); - } - - public static IUniTaskAsyncEnumerable Select(this IUniTaskAsyncEnumerable source, Func selector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(selector, nameof(selector)); - - return new VirtueSky.Threading.Tasks.Linq.SelectInt(source, selector); - } - - public static IUniTaskAsyncEnumerable SelectAwait(this IUniTaskAsyncEnumerable source, Func> selector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(selector, nameof(selector)); - - return new VirtueSky.Threading.Tasks.Linq.SelectAwait(source, selector); - } - - public static IUniTaskAsyncEnumerable SelectAwait(this IUniTaskAsyncEnumerable source, Func> selector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(selector, nameof(selector)); - - return new VirtueSky.Threading.Tasks.Linq.SelectIntAwait(source, selector); - } - - public static IUniTaskAsyncEnumerable SelectAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> selector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(selector, nameof(selector)); - - return new VirtueSky.Threading.Tasks.Linq.SelectAwaitWithCancellation(source, selector); - } - - public static IUniTaskAsyncEnumerable SelectAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> selector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(selector, nameof(selector)); - - return new VirtueSky.Threading.Tasks.Linq.SelectIntAwaitWithCancellation(source, selector); - } - } - - internal sealed class Select : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func selector; - - public Select(IUniTaskAsyncEnumerable source, Func selector) - { - this.source = source; - this.selector = selector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Select(source, selector, cancellationToken); - } - - sealed class _Select : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - readonly Func selector; - readonly CancellationToken cancellationToken; - - int state = -1; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - Action moveNextAction; - - public _Select(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - this.source = source; - this.selector = selector; - this.cancellationToken = cancellationToken; - this.moveNextAction = MoveNext; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (state == -2) return default; - - completionSource.Reset(); - MoveNext(); - return new UniTask(this, completionSource.Version); - } - - void MoveNext() - { - try - { - switch (state) - { - case -1: // init - enumerator = source.GetAsyncEnumerator(cancellationToken); - goto case 0; - case 0: - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case 1; - } - else - { - state = 1; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case 1: - if (awaiter.GetResult()) - { - Current = selector(enumerator.Current); - goto CONTINUE; - } - else - { - goto DONE; - } - default: - goto DONE; - } - } - catch (Exception ex) - { - state = -2; - completionSource.TrySetException(ex); - return; - } - - DONE: - state = -2; - completionSource.TrySetResult(false); - return; - - CONTINUE: - state = 0; - completionSource.TrySetResult(true); - return; - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - return enumerator.DisposeAsync(); - } - } - } - - internal sealed class SelectInt : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func selector; - - public SelectInt(IUniTaskAsyncEnumerable source, Func selector) - { - this.source = source; - this.selector = selector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Select(source, selector, cancellationToken); - } - - sealed class _Select : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - readonly Func selector; - readonly CancellationToken cancellationToken; - - int state = -1; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - Action moveNextAction; - int index; - - public _Select(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - this.source = source; - this.selector = selector; - this.cancellationToken = cancellationToken; - this.moveNextAction = MoveNext; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (state == -2) return default; - - completionSource.Reset(); - MoveNext(); - return new UniTask(this, completionSource.Version); - } - - void MoveNext() - { - try - { - switch (state) - { - case -1: // init - enumerator = source.GetAsyncEnumerator(cancellationToken); - goto case 0; - case 0: - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case 1; - } - else - { - state = 1; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case 1: - if (awaiter.GetResult()) - { - Current = selector(enumerator.Current, checked(index++)); - goto CONTINUE; - } - else - { - goto DONE; - } - default: - goto DONE; - } - } - catch (Exception ex) - { - state = -2; - completionSource.TrySetException(ex); - return; - } - - DONE: - state = -2; - completionSource.TrySetResult(false); - return; - - CONTINUE: - state = 0; - completionSource.TrySetResult(true); - return; - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - return enumerator.DisposeAsync(); - } - } - } - - internal sealed class SelectAwait : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> selector; - - public SelectAwait(IUniTaskAsyncEnumerable source, Func> selector) - { - this.source = source; - this.selector = selector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _SelectAwait(source, selector, cancellationToken); - } - - sealed class _SelectAwait : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> selector; - readonly CancellationToken cancellationToken; - - int state = -1; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - UniTask.Awaiter awaiter2; - Action moveNextAction; - - public _SelectAwait(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - this.source = source; - this.selector = selector; - this.cancellationToken = cancellationToken; - this.moveNextAction = MoveNext; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (state == -2) return default; - - completionSource.Reset(); - MoveNext(); - return new UniTask(this, completionSource.Version); - } - - void MoveNext() - { - try - { - switch (state) - { - case -1: // init - enumerator = source.GetAsyncEnumerator(cancellationToken); - goto case 0; - case 0: - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case 1; - } - else - { - state = 1; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case 1: - if (awaiter.GetResult()) - { - awaiter2 = selector(enumerator.Current).GetAwaiter(); - if (awaiter2.IsCompleted) - { - goto case 2; - } - else - { - state = 2; - awaiter2.UnsafeOnCompleted(moveNextAction); - return; - } - } - else - { - goto DONE; - } - case 2: - Current = awaiter2.GetResult(); - goto CONTINUE; - default: - goto DONE; - } - } - catch (Exception ex) - { - state = -2; - completionSource.TrySetException(ex); - return; - } - - DONE: - state = -2; - completionSource.TrySetResult(false); - return; - - CONTINUE: - state = 0; - completionSource.TrySetResult(true); - return; - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - return enumerator.DisposeAsync(); - } - } - } - - internal sealed class SelectIntAwait : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> selector; - - public SelectIntAwait(IUniTaskAsyncEnumerable source, Func> selector) - { - this.source = source; - this.selector = selector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _SelectAwait(source, selector, cancellationToken); - } - - sealed class _SelectAwait : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> selector; - readonly CancellationToken cancellationToken; - - int state = -1; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - UniTask.Awaiter awaiter2; - Action moveNextAction; - int index; - - public _SelectAwait(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - this.source = source; - this.selector = selector; - this.cancellationToken = cancellationToken; - this.moveNextAction = MoveNext; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (state == -2) return default; - - completionSource.Reset(); - MoveNext(); - return new UniTask(this, completionSource.Version); - } - - void MoveNext() - { - try - { - switch (state) - { - case -1: // init - enumerator = source.GetAsyncEnumerator(cancellationToken); - goto case 0; - case 0: - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case 1; - } - else - { - state = 1; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case 1: - if (awaiter.GetResult()) - { - awaiter2 = selector(enumerator.Current, checked(index++)).GetAwaiter(); - if (awaiter2.IsCompleted) - { - goto case 2; - } - else - { - state = 2; - awaiter2.UnsafeOnCompleted(moveNextAction); - return; - } - } - else - { - goto DONE; - } - case 2: - Current = awaiter2.GetResult(); - goto CONTINUE; - default: - goto DONE; - } - } - catch (Exception ex) - { - state = -2; - completionSource.TrySetException(ex); - return; - } - - DONE: - state = -2; - completionSource.TrySetResult(false); - return; - - CONTINUE: - state = 0; - completionSource.TrySetResult(true); - return; - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - return enumerator.DisposeAsync(); - } - } - } - - internal sealed class SelectAwaitWithCancellation : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> selector; - - public SelectAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> selector) - { - this.source = source; - this.selector = selector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _SelectAwaitWithCancellation(source, selector, cancellationToken); - } - - sealed class _SelectAwaitWithCancellation : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> selector; - readonly CancellationToken cancellationToken; - - int state = -1; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - UniTask.Awaiter awaiter2; - Action moveNextAction; - - public _SelectAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - this.source = source; - this.selector = selector; - this.cancellationToken = cancellationToken; - this.moveNextAction = MoveNext; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (state == -2) return default; - - completionSource.Reset(); - MoveNext(); - return new UniTask(this, completionSource.Version); - } - - void MoveNext() - { - try - { - switch (state) - { - case -1: // init - enumerator = source.GetAsyncEnumerator(cancellationToken); - goto case 0; - case 0: - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case 1; - } - else - { - state = 1; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case 1: - if (awaiter.GetResult()) - { - awaiter2 = selector(enumerator.Current, cancellationToken).GetAwaiter(); - if (awaiter2.IsCompleted) - { - goto case 2; - } - else - { - state = 2; - awaiter2.UnsafeOnCompleted(moveNextAction); - return; - } - } - else - { - goto DONE; - } - case 2: - Current = awaiter2.GetResult(); - goto CONTINUE; - default: - goto DONE; - } - } - catch (Exception ex) - { - state = -2; - completionSource.TrySetException(ex); - return; - } - - DONE: - state = -2; - completionSource.TrySetResult(false); - return; - - CONTINUE: - state = 0; - completionSource.TrySetResult(true); - return; - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - return enumerator.DisposeAsync(); - } - } - } - - internal sealed class SelectIntAwaitWithCancellation : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> selector; - - public SelectIntAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> selector) - { - this.source = source; - this.selector = selector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _SelectAwaitWithCancellation(source, selector, cancellationToken); - } - - sealed class _SelectAwaitWithCancellation : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> selector; - readonly CancellationToken cancellationToken; - - int state = -1; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - UniTask.Awaiter awaiter2; - Action moveNextAction; - int index; - - public _SelectAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - this.source = source; - this.selector = selector; - this.cancellationToken = cancellationToken; - this.moveNextAction = MoveNext; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (state == -2) return default; - - completionSource.Reset(); - MoveNext(); - return new UniTask(this, completionSource.Version); - } - - void MoveNext() - { - try - { - switch (state) - { - case -1: // init - enumerator = source.GetAsyncEnumerator(cancellationToken); - goto case 0; - case 0: - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case 1; - } - else - { - state = 1; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case 1: - if (awaiter.GetResult()) - { - awaiter2 = selector(enumerator.Current, checked(index++), cancellationToken).GetAwaiter(); - if (awaiter2.IsCompleted) - { - goto case 2; - } - else - { - state = 2; - awaiter2.UnsafeOnCompleted(moveNextAction); - return; - } - } - else - { - goto DONE; - } - case 2: - Current = awaiter2.GetResult(); - goto CONTINUE; - default: - goto DONE; - } - } - catch (Exception ex) - { - state = -2; - completionSource.TrySetException(ex); - return; - } - - DONE: - state = -2; - completionSource.TrySetResult(false); - return; - - CONTINUE: - state = 0; - completionSource.TrySetResult(true); - return; - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - return enumerator.DisposeAsync(); - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Select.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Select.cs.meta deleted file mode 100644 index 476e9723..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Select.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: dc68e598ca44a134b988dfaf5e53bfba -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/SelectMany.cs b/VirtueSky/UniTask/Runtime/Linq/SelectMany.cs deleted file mode 100644 index cf022705..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/SelectMany.cs +++ /dev/null @@ -1,892 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - - public static IUniTaskAsyncEnumerable SelectMany(this IUniTaskAsyncEnumerable source, Func> selector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(selector, nameof(selector)); - - return new SelectMany(source, selector, (x, y) => y); - } - - public static IUniTaskAsyncEnumerable SelectMany(this IUniTaskAsyncEnumerable source, Func> selector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(selector, nameof(selector)); - - return new SelectMany(source, selector, (x, y) => y); - } - - public static IUniTaskAsyncEnumerable SelectMany(this IUniTaskAsyncEnumerable source, Func> collectionSelector, Func resultSelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(collectionSelector, nameof(collectionSelector)); - - return new SelectMany(source, collectionSelector, resultSelector); - } - - public static IUniTaskAsyncEnumerable SelectMany(this IUniTaskAsyncEnumerable source, Func> collectionSelector, Func resultSelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(collectionSelector, nameof(collectionSelector)); - - return new SelectMany(source, collectionSelector, resultSelector); - } - - public static IUniTaskAsyncEnumerable SelectManyAwait(this IUniTaskAsyncEnumerable source, Func>> selector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(selector, nameof(selector)); - - return new SelectManyAwait(source, selector, (x, y) => UniTask.FromResult(y)); - } - - public static IUniTaskAsyncEnumerable SelectManyAwait(this IUniTaskAsyncEnumerable source, Func>> selector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(selector, nameof(selector)); - - return new SelectManyAwait(source, selector, (x, y) => UniTask.FromResult(y)); - } - - public static IUniTaskAsyncEnumerable SelectManyAwait(this IUniTaskAsyncEnumerable source, Func>> collectionSelector, Func> resultSelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(collectionSelector, nameof(collectionSelector)); - - return new SelectManyAwait(source, collectionSelector, resultSelector); - } - - public static IUniTaskAsyncEnumerable SelectManyAwait(this IUniTaskAsyncEnumerable source, Func>> collectionSelector, Func> resultSelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(collectionSelector, nameof(collectionSelector)); - - return new SelectManyAwait(source, collectionSelector, resultSelector); - } - - public static IUniTaskAsyncEnumerable SelectManyAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func>> selector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(selector, nameof(selector)); - - return new SelectManyAwaitWithCancellation(source, selector, (x, y, c) => UniTask.FromResult(y)); - } - - public static IUniTaskAsyncEnumerable SelectManyAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func>> selector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(selector, nameof(selector)); - - return new SelectManyAwaitWithCancellation(source, selector, (x, y, c) => UniTask.FromResult(y)); - } - - public static IUniTaskAsyncEnumerable SelectManyAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func>> collectionSelector, Func> resultSelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(collectionSelector, nameof(collectionSelector)); - - return new SelectManyAwaitWithCancellation(source, collectionSelector, resultSelector); - } - - public static IUniTaskAsyncEnumerable SelectManyAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func>> collectionSelector, Func> resultSelector) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(collectionSelector, nameof(collectionSelector)); - - return new SelectManyAwaitWithCancellation(source, collectionSelector, resultSelector); - } - } - - internal sealed class SelectMany : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> selector1; - readonly Func> selector2; - readonly Func resultSelector; - - public SelectMany(IUniTaskAsyncEnumerable source, Func> selector, Func resultSelector) - { - this.source = source; - this.selector1 = selector; - this.selector2 = null; - this.resultSelector = resultSelector; - } - - public SelectMany(IUniTaskAsyncEnumerable source, Func> selector, Func resultSelector) - { - this.source = source; - this.selector1 = null; - this.selector2 = selector; - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _SelectMany(source, selector1, selector2, resultSelector, cancellationToken); - } - - sealed class _SelectMany : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action sourceMoveNextCoreDelegate = SourceMoveNextCore; - static readonly Action selectedSourceMoveNextCoreDelegate = SeletedSourceMoveNextCore; - static readonly Action selectedEnumeratorDisposeAsyncCoreDelegate = SelectedEnumeratorDisposeAsyncCore; - - readonly IUniTaskAsyncEnumerable source; - - readonly Func> selector1; - readonly Func> selector2; - readonly Func resultSelector; - CancellationToken cancellationToken; - - TSource sourceCurrent; - int sourceIndex; - IUniTaskAsyncEnumerator sourceEnumerator; - IUniTaskAsyncEnumerator selectedEnumerator; - UniTask.Awaiter sourceAwaiter; - UniTask.Awaiter selectedAwaiter; - UniTask.Awaiter selectedDisposeAsyncAwaiter; - - public _SelectMany(IUniTaskAsyncEnumerable source, Func> selector1, Func> selector2, Func resultSelector, CancellationToken cancellationToken) - { - this.source = source; - this.selector1 = selector1; - this.selector2 = selector2; - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - completionSource.Reset(); - - // iterate selected field - if (selectedEnumerator != null) - { - MoveNextSelected(); - } - else - { - // iterate source field - if (sourceEnumerator == null) - { - sourceEnumerator = source.GetAsyncEnumerator(cancellationToken); - } - MoveNextSource(); - } - - return new UniTask(this, completionSource.Version); - } - - void MoveNextSource() - { - try - { - sourceAwaiter = sourceEnumerator.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - - if (sourceAwaiter.IsCompleted) - { - SourceMoveNextCore(this); - } - else - { - sourceAwaiter.SourceOnCompleted(sourceMoveNextCoreDelegate, this); - } - } - - void MoveNextSelected() - { - try - { - selectedAwaiter = selectedEnumerator.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - - if (selectedAwaiter.IsCompleted) - { - SeletedSourceMoveNextCore(this); - } - else - { - selectedAwaiter.SourceOnCompleted(selectedSourceMoveNextCoreDelegate, this); - } - } - - static void SourceMoveNextCore(object state) - { - var self = (_SelectMany)state; - - if (self.TryGetResult(self.sourceAwaiter, out var result)) - { - if (result) - { - try - { - self.sourceCurrent = self.sourceEnumerator.Current; - if (self.selector1 != null) - { - self.selectedEnumerator = self.selector1(self.sourceCurrent).GetAsyncEnumerator(self.cancellationToken); - } - else - { - self.selectedEnumerator = self.selector2(self.sourceCurrent, checked(self.sourceIndex++)).GetAsyncEnumerator(self.cancellationToken); - } - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - return; - } - - self.MoveNextSelected(); // iterated selected source. - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - - static void SeletedSourceMoveNextCore(object state) - { - var self = (_SelectMany)state; - - if (self.TryGetResult(self.selectedAwaiter, out var result)) - { - if (result) - { - try - { - self.Current = self.resultSelector(self.sourceCurrent, self.selectedEnumerator.Current); - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - return; - } - - self.completionSource.TrySetResult(true); - } - else - { - // dispose selected source and try iterate source. - try - { - self.selectedDisposeAsyncAwaiter = self.selectedEnumerator.DisposeAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - return; - } - if (self.selectedDisposeAsyncAwaiter.IsCompleted) - { - SelectedEnumeratorDisposeAsyncCore(self); - } - else - { - self.selectedDisposeAsyncAwaiter.SourceOnCompleted(selectedEnumeratorDisposeAsyncCoreDelegate, self); - } - } - } - } - - static void SelectedEnumeratorDisposeAsyncCore(object state) - { - var self = (_SelectMany)state; - - if (self.TryGetResult(self.selectedDisposeAsyncAwaiter)) - { - self.selectedEnumerator = null; - self.selectedAwaiter = default; - - self.MoveNextSource(); // iterate next source - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (selectedEnumerator != null) - { - await selectedEnumerator.DisposeAsync(); - } - if (sourceEnumerator != null) - { - await sourceEnumerator.DisposeAsync(); - } - } - } - } - - internal sealed class SelectManyAwait : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func>> selector1; - readonly Func>> selector2; - readonly Func> resultSelector; - - public SelectManyAwait(IUniTaskAsyncEnumerable source, Func>> selector, Func> resultSelector) - { - this.source = source; - this.selector1 = selector; - this.selector2 = null; - this.resultSelector = resultSelector; - } - - public SelectManyAwait(IUniTaskAsyncEnumerable source, Func>> selector, Func> resultSelector) - { - this.source = source; - this.selector1 = null; - this.selector2 = selector; - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _SelectManyAwait(source, selector1, selector2, resultSelector, cancellationToken); - } - - sealed class _SelectManyAwait : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action sourceMoveNextCoreDelegate = SourceMoveNextCore; - static readonly Action selectedSourceMoveNextCoreDelegate = SeletedSourceMoveNextCore; - static readonly Action selectedEnumeratorDisposeAsyncCoreDelegate = SelectedEnumeratorDisposeAsyncCore; - static readonly Action selectorAwaitCoreDelegate = SelectorAwaitCore; - static readonly Action resultSelectorAwaitCoreDelegate = ResultSelectorAwaitCore; - - readonly IUniTaskAsyncEnumerable source; - - readonly Func>> selector1; - readonly Func>> selector2; - readonly Func> resultSelector; - CancellationToken cancellationToken; - - TSource sourceCurrent; - int sourceIndex; - IUniTaskAsyncEnumerator sourceEnumerator; - IUniTaskAsyncEnumerator selectedEnumerator; - UniTask.Awaiter sourceAwaiter; - UniTask.Awaiter selectedAwaiter; - UniTask.Awaiter selectedDisposeAsyncAwaiter; - - // await additional - UniTask>.Awaiter collectionSelectorAwaiter; - UniTask.Awaiter resultSelectorAwaiter; - - public _SelectManyAwait(IUniTaskAsyncEnumerable source, Func>> selector1, Func>> selector2, Func> resultSelector, CancellationToken cancellationToken) - { - this.source = source; - this.selector1 = selector1; - this.selector2 = selector2; - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - completionSource.Reset(); - - // iterate selected field - if (selectedEnumerator != null) - { - MoveNextSelected(); - } - else - { - // iterate source field - if (sourceEnumerator == null) - { - sourceEnumerator = source.GetAsyncEnumerator(cancellationToken); - } - MoveNextSource(); - } - - return new UniTask(this, completionSource.Version); - } - - void MoveNextSource() - { - try - { - sourceAwaiter = sourceEnumerator.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - - if (sourceAwaiter.IsCompleted) - { - SourceMoveNextCore(this); - } - else - { - sourceAwaiter.SourceOnCompleted(sourceMoveNextCoreDelegate, this); - } - } - - void MoveNextSelected() - { - try - { - selectedAwaiter = selectedEnumerator.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - - if (selectedAwaiter.IsCompleted) - { - SeletedSourceMoveNextCore(this); - } - else - { - selectedAwaiter.SourceOnCompleted(selectedSourceMoveNextCoreDelegate, this); - } - } - - static void SourceMoveNextCore(object state) - { - var self = (_SelectManyAwait)state; - - if (self.TryGetResult(self.sourceAwaiter, out var result)) - { - if (result) - { - try - { - self.sourceCurrent = self.sourceEnumerator.Current; - - if (self.selector1 != null) - { - self.collectionSelectorAwaiter = self.selector1(self.sourceCurrent).GetAwaiter(); - } - else - { - self.collectionSelectorAwaiter = self.selector2(self.sourceCurrent, checked(self.sourceIndex++)).GetAwaiter(); - } - - if (self.collectionSelectorAwaiter.IsCompleted) - { - SelectorAwaitCore(self); - } - else - { - self.collectionSelectorAwaiter.SourceOnCompleted(selectorAwaitCoreDelegate, self); - } - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - return; - } - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - - static void SeletedSourceMoveNextCore(object state) - { - var self = (_SelectManyAwait)state; - - if (self.TryGetResult(self.selectedAwaiter, out var result)) - { - if (result) - { - try - { - self.resultSelectorAwaiter = self.resultSelector(self.sourceCurrent, self.selectedEnumerator.Current).GetAwaiter(); - if (self.resultSelectorAwaiter.IsCompleted) - { - ResultSelectorAwaitCore(self); - } - else - { - self.resultSelectorAwaiter.SourceOnCompleted(resultSelectorAwaitCoreDelegate, self); - } - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - return; - } - } - else - { - // dispose selected source and try iterate source. - try - { - self.selectedDisposeAsyncAwaiter = self.selectedEnumerator.DisposeAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - return; - } - if (self.selectedDisposeAsyncAwaiter.IsCompleted) - { - SelectedEnumeratorDisposeAsyncCore(self); - } - else - { - self.selectedDisposeAsyncAwaiter.SourceOnCompleted(selectedEnumeratorDisposeAsyncCoreDelegate, self); - } - } - } - } - - static void SelectedEnumeratorDisposeAsyncCore(object state) - { - var self = (_SelectManyAwait)state; - - if (self.TryGetResult(self.selectedDisposeAsyncAwaiter)) - { - self.selectedEnumerator = null; - self.selectedAwaiter = default; - - self.MoveNextSource(); // iterate next source - } - } - - static void SelectorAwaitCore(object state) - { - var self = (_SelectManyAwait)state; - - if (self.TryGetResult(self.collectionSelectorAwaiter, out var result)) - { - self.selectedEnumerator = result.GetAsyncEnumerator(self.cancellationToken); - self.MoveNextSelected(); // iterated selected source. - } - } - - static void ResultSelectorAwaitCore(object state) - { - var self = (_SelectManyAwait)state; - - if (self.TryGetResult(self.resultSelectorAwaiter, out var result)) - { - self.Current = result; - self.completionSource.TrySetResult(true); - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (selectedEnumerator != null) - { - await selectedEnumerator.DisposeAsync(); - } - if (sourceEnumerator != null) - { - await sourceEnumerator.DisposeAsync(); - } - } - } - } - - internal sealed class SelectManyAwaitWithCancellation : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func>> selector1; - readonly Func>> selector2; - readonly Func> resultSelector; - - public SelectManyAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func>> selector, Func> resultSelector) - { - this.source = source; - this.selector1 = selector; - this.selector2 = null; - this.resultSelector = resultSelector; - } - - public SelectManyAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func>> selector, Func> resultSelector) - { - this.source = source; - this.selector1 = null; - this.selector2 = selector; - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _SelectManyAwaitWithCancellation(source, selector1, selector2, resultSelector, cancellationToken); - } - - sealed class _SelectManyAwaitWithCancellation : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action sourceMoveNextCoreDelegate = SourceMoveNextCore; - static readonly Action selectedSourceMoveNextCoreDelegate = SeletedSourceMoveNextCore; - static readonly Action selectedEnumeratorDisposeAsyncCoreDelegate = SelectedEnumeratorDisposeAsyncCore; - static readonly Action selectorAwaitCoreDelegate = SelectorAwaitCore; - static readonly Action resultSelectorAwaitCoreDelegate = ResultSelectorAwaitCore; - - readonly IUniTaskAsyncEnumerable source; - - readonly Func>> selector1; - readonly Func>> selector2; - readonly Func> resultSelector; - CancellationToken cancellationToken; - - TSource sourceCurrent; - int sourceIndex; - IUniTaskAsyncEnumerator sourceEnumerator; - IUniTaskAsyncEnumerator selectedEnumerator; - UniTask.Awaiter sourceAwaiter; - UniTask.Awaiter selectedAwaiter; - UniTask.Awaiter selectedDisposeAsyncAwaiter; - - // await additional - UniTask>.Awaiter collectionSelectorAwaiter; - UniTask.Awaiter resultSelectorAwaiter; - - public _SelectManyAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func>> selector1, Func>> selector2, Func> resultSelector, CancellationToken cancellationToken) - { - this.source = source; - this.selector1 = selector1; - this.selector2 = selector2; - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - completionSource.Reset(); - - // iterate selected field - if (selectedEnumerator != null) - { - MoveNextSelected(); - } - else - { - // iterate source field - if (sourceEnumerator == null) - { - sourceEnumerator = source.GetAsyncEnumerator(cancellationToken); - } - MoveNextSource(); - } - - return new UniTask(this, completionSource.Version); - } - - void MoveNextSource() - { - try - { - sourceAwaiter = sourceEnumerator.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - - if (sourceAwaiter.IsCompleted) - { - SourceMoveNextCore(this); - } - else - { - sourceAwaiter.SourceOnCompleted(sourceMoveNextCoreDelegate, this); - } - } - - void MoveNextSelected() - { - try - { - selectedAwaiter = selectedEnumerator.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return; - } - - if (selectedAwaiter.IsCompleted) - { - SeletedSourceMoveNextCore(this); - } - else - { - selectedAwaiter.SourceOnCompleted(selectedSourceMoveNextCoreDelegate, this); - } - } - - static void SourceMoveNextCore(object state) - { - var self = (_SelectManyAwaitWithCancellation)state; - - if (self.TryGetResult(self.sourceAwaiter, out var result)) - { - if (result) - { - try - { - self.sourceCurrent = self.sourceEnumerator.Current; - - if (self.selector1 != null) - { - self.collectionSelectorAwaiter = self.selector1(self.sourceCurrent, self.cancellationToken).GetAwaiter(); - } - else - { - self.collectionSelectorAwaiter = self.selector2(self.sourceCurrent, checked(self.sourceIndex++), self.cancellationToken).GetAwaiter(); - } - - if (self.collectionSelectorAwaiter.IsCompleted) - { - SelectorAwaitCore(self); - } - else - { - self.collectionSelectorAwaiter.SourceOnCompleted(selectorAwaitCoreDelegate, self); - } - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - return; - } - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - - static void SeletedSourceMoveNextCore(object state) - { - var self = (_SelectManyAwaitWithCancellation)state; - - if (self.TryGetResult(self.selectedAwaiter, out var result)) - { - if (result) - { - try - { - self.resultSelectorAwaiter = self.resultSelector(self.sourceCurrent, self.selectedEnumerator.Current, self.cancellationToken).GetAwaiter(); - if (self.resultSelectorAwaiter.IsCompleted) - { - ResultSelectorAwaitCore(self); - } - else - { - self.resultSelectorAwaiter.SourceOnCompleted(resultSelectorAwaitCoreDelegate, self); - } - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - return; - } - } - else - { - // dispose selected source and try iterate source. - try - { - self.selectedDisposeAsyncAwaiter = self.selectedEnumerator.DisposeAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - return; - } - if (self.selectedDisposeAsyncAwaiter.IsCompleted) - { - SelectedEnumeratorDisposeAsyncCore(self); - } - else - { - self.selectedDisposeAsyncAwaiter.SourceOnCompleted(selectedEnumeratorDisposeAsyncCoreDelegate, self); - } - } - } - } - - static void SelectedEnumeratorDisposeAsyncCore(object state) - { - var self = (_SelectManyAwaitWithCancellation)state; - - if (self.TryGetResult(self.selectedDisposeAsyncAwaiter)) - { - self.selectedEnumerator = null; - self.selectedAwaiter = default; - - self.MoveNextSource(); // iterate next source - } - } - - static void SelectorAwaitCore(object state) - { - var self = (_SelectManyAwaitWithCancellation)state; - - if (self.TryGetResult(self.collectionSelectorAwaiter, out var result)) - { - self.selectedEnumerator = result.GetAsyncEnumerator(self.cancellationToken); - self.MoveNextSelected(); // iterated selected source. - } - } - - static void ResultSelectorAwaitCore(object state) - { - var self = (_SelectManyAwaitWithCancellation)state; - - if (self.TryGetResult(self.resultSelectorAwaiter, out var result)) - { - self.Current = result; - self.completionSource.TrySetResult(true); - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (selectedEnumerator != null) - { - await selectedEnumerator.DisposeAsync(); - } - if (sourceEnumerator != null) - { - await sourceEnumerator.DisposeAsync(); - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/SelectMany.cs.meta b/VirtueSky/UniTask/Runtime/Linq/SelectMany.cs.meta deleted file mode 100644 index a8dbbaf6..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/SelectMany.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d81862f0eb12680479ccaaf2ac319d24 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/SequenceEqual.cs b/VirtueSky/UniTask/Runtime/Linq/SequenceEqual.cs deleted file mode 100644 index 95b4a6c0..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/SequenceEqual.cs +++ /dev/null @@ -1,87 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask SequenceEqualAsync(this IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, CancellationToken cancellationToken = default) - { - return SequenceEqualAsync(first, second, EqualityComparer.Default, cancellationToken); - } - - public static UniTask SequenceEqualAsync(this IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, IEqualityComparer comparer, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(first, nameof(first)); - Error.ThrowArgumentNullException(second, nameof(second)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return SequenceEqual.SequenceEqualAsync(first, second, comparer, cancellationToken); - } - } - - internal static class SequenceEqual - { - internal static async UniTask SequenceEqualAsync(IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, IEqualityComparer comparer, CancellationToken cancellationToken) - { - var e1 = first.GetAsyncEnumerator(cancellationToken); - try - { - var e2 = second.GetAsyncEnumerator(cancellationToken); - try - { - while (true) - { - if (await e1.MoveNextAsync()) - { - if (await e2.MoveNextAsync()) - { - if (comparer.Equals(e1.Current, e2.Current)) - { - continue; - } - else - { - return false; - } - } - else - { - // e2 is finished, but e1 has value - return false; - } - } - else - { - // e1 is finished, e2? - if (await e2.MoveNextAsync()) - { - return false; - } - else - { - return true; - } - } - } - } - finally - { - if (e2 != null) - { - await e2.DisposeAsync(); - } - } - } - finally - { - if (e1 != null) - { - await e1.DisposeAsync(); - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/SequenceEqual.cs.meta b/VirtueSky/UniTask/Runtime/Linq/SequenceEqual.cs.meta deleted file mode 100644 index ee2b75c2..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/SequenceEqual.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b382772aba6128842928cdb6b2e034b0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Single.cs b/VirtueSky/UniTask/Runtime/Linq/Single.cs deleted file mode 100644 index 6eb02b80..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Single.cs +++ /dev/null @@ -1,230 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask SingleAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return SingleOperator.SingleAsync(source, cancellationToken, false); - } - - public static UniTask SingleAsync(this IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return SingleOperator.SingleAsync(source, predicate, cancellationToken, false); - } - - public static UniTask SingleAwaitAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return SingleOperator.SingleAwaitAsync(source, predicate, cancellationToken, false); - } - - public static UniTask SingleAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return SingleOperator.SingleAwaitWithCancellationAsync(source, predicate, cancellationToken, false); - } - - public static UniTask SingleOrDefaultAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return SingleOperator.SingleAsync(source, cancellationToken, true); - } - - public static UniTask SingleOrDefaultAsync(this IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return SingleOperator.SingleAsync(source, predicate, cancellationToken, true); - } - - public static UniTask SingleOrDefaultAwaitAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return SingleOperator.SingleAwaitAsync(source, predicate, cancellationToken, true); - } - - public static UniTask SingleOrDefaultAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return SingleOperator.SingleAwaitWithCancellationAsync(source, predicate, cancellationToken, true); - } - } - - internal static class SingleOperator - { - public static async UniTask SingleAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken, bool defaultIfEmpty) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - if (await e.MoveNextAsync()) - { - var v = e.Current; - if (!await e.MoveNextAsync()) - { - return v; - } - - throw Error.MoreThanOneElement(); - } - else - { - if (defaultIfEmpty) - { - return default; - } - else - { - throw Error.NoElements(); - } - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTask SingleAsync(IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken, bool defaultIfEmpty) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - TSource value = default; - bool found = false; - while (await e.MoveNextAsync()) - { - var v = e.Current; - if (predicate(v)) - { - if (found) - { - throw Error.MoreThanOneElement(); - } - else - { - found = true; - value = v; - } - } - } - - if (found || defaultIfEmpty) - { - return value; - } - - throw Error.NoElements(); - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTask SingleAwaitAsync(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken, bool defaultIfEmpty) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - TSource value = default; - bool found = false; - while (await e.MoveNextAsync()) - { - var v = e.Current; - if (await predicate(v)) - { - if (found) - { - throw Error.MoreThanOneElement(); - } - else - { - found = true; - value = v; - } - } - } - - if (found || defaultIfEmpty) - { - return value; - } - - throw Error.NoElements(); - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTask SingleAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken, bool defaultIfEmpty) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - TSource value = default; - bool found = false; - while (await e.MoveNextAsync()) - { - var v = e.Current; - if (await predicate(v, cancellationToken)) - { - if (found) - { - throw Error.MoreThanOneElement(); - } - else - { - found = true; - value = v; - } - } - } - - if (found || defaultIfEmpty) - { - return value; - } - - throw Error.NoElements(); - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Single.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Single.cs.meta deleted file mode 100644 index c053dfd7..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Single.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1bcd3928b90472e43a3a92c3ba708967 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Skip.cs b/VirtueSky/UniTask/Runtime/Linq/Skip.cs deleted file mode 100644 index 4a920ba3..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Skip.cs +++ /dev/null @@ -1,69 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Skip(this IUniTaskAsyncEnumerable source, Int32 count) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return new Skip(source, count); - } - } - - internal sealed class Skip : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly int count; - - public Skip(IUniTaskAsyncEnumerable source, int count) - { - this.source = source; - this.count = count; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Skip(source, count, cancellationToken); - } - - sealed class _Skip : AsyncEnumeratorBase - { - readonly int count; - - int index; - - public _Skip(IUniTaskAsyncEnumerable source, int count, CancellationToken cancellationToken) - : base(source, cancellationToken) - { - this.count = count; - } - - protected override bool TryMoveNextCore(bool sourceHasCurrent, out bool result) - { - if (sourceHasCurrent) - { - if (count <= checked(index++)) - { - Current = SourceCurrent; - result = true; - return true; - } - else - { - result = default; - return false; - } - } - else - { - result = false; - return true; - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Skip.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Skip.cs.meta deleted file mode 100644 index 25ad847b..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Skip.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9c46b6c7dce0cb049a73c81084c75154 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/SkipLast.cs b/VirtueSky/UniTask/Runtime/Linq/SkipLast.cs deleted file mode 100644 index 72241b58..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/SkipLast.cs +++ /dev/null @@ -1,159 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable SkipLast(this IUniTaskAsyncEnumerable source, Int32 count) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - // non skip. - if (count <= 0) - { - return source; - } - - return new SkipLast(source, count); - } - } - - internal sealed class SkipLast : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly int count; - - public SkipLast(IUniTaskAsyncEnumerable source, int count) - { - this.source = source; - this.count = count; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _SkipLast(source, count, cancellationToken); - } - - sealed class _SkipLast : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action MoveNextCoreDelegate = MoveNextCore; - - readonly IUniTaskAsyncEnumerable source; - readonly int count; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - Queue queue; - - bool continueNext; - - public _SkipLast(IUniTaskAsyncEnumerable source, int count, CancellationToken cancellationToken) - { - this.source = source; - this.count = count; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TSource Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - - if (enumerator == null) - { - enumerator = source.GetAsyncEnumerator(cancellationToken); - queue = new Queue(); - } - - completionSource.Reset(); - SourceMoveNext(); - return new UniTask(this, completionSource.Version); - } - - void SourceMoveNext() - { - try - { - - LOOP: - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - continueNext = true; - MoveNextCore(this); - if (continueNext) - { - continueNext = false; - goto LOOP; // avoid recursive - } - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - } - - - static void MoveNextCore(object state) - { - var self = (_SkipLast)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - if (self.queue.Count == self.count) - { - self.continueNext = false; - - var deq = self.queue.Dequeue(); - self.Current = deq; - self.queue.Enqueue(self.enumerator.Current); - - self.completionSource.TrySetResult(true); - } - else - { - self.queue.Enqueue(self.enumerator.Current); - - if (!self.continueNext) - { - self.SourceMoveNext(); - } - } - } - else - { - self.continueNext = false; - self.completionSource.TrySetResult(false); - } - } - else - { - self.continueNext = false; - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/SkipLast.cs.meta b/VirtueSky/UniTask/Runtime/Linq/SkipLast.cs.meta deleted file mode 100644 index 06b1ede4..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/SkipLast.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: df1d7f44d4fe7754f972c9e0b6fa72d5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/SkipUntil.cs b/VirtueSky/UniTask/Runtime/Linq/SkipUntil.cs deleted file mode 100644 index 7f640303..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/SkipUntil.cs +++ /dev/null @@ -1,187 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable SkipUntil(this IUniTaskAsyncEnumerable source, UniTask other) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return new SkipUntil(source, other, null); - } - - public static IUniTaskAsyncEnumerable SkipUntil(this IUniTaskAsyncEnumerable source, Func other) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(other)); - - return new SkipUntil(source, default, other); - } - } - - internal sealed class SkipUntil : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly UniTask other; - readonly Func other2; - - public SkipUntil(IUniTaskAsyncEnumerable source, UniTask other, Func other2) - { - this.source = source; - this.other = other; - this.other2 = other2; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - if (other2 != null) - { - return new _SkipUntil(source, this.other2(cancellationToken), cancellationToken); - } - else - { - return new _SkipUntil(source, this.other, cancellationToken); - } - } - - sealed class _SkipUntil : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action CancelDelegate1 = OnCanceled1; - static readonly Action MoveNextCoreDelegate = MoveNextCore; - - readonly IUniTaskAsyncEnumerable source; - CancellationToken cancellationToken1; - - bool completed; - CancellationTokenRegistration cancellationTokenRegistration1; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - bool continueNext; - Exception exception; - - public _SkipUntil(IUniTaskAsyncEnumerable source, UniTask other, CancellationToken cancellationToken1) - { - this.source = source; - this.cancellationToken1 = cancellationToken1; - if (cancellationToken1.CanBeCanceled) - { - this.cancellationTokenRegistration1 = cancellationToken1.RegisterWithoutCaptureExecutionContext(CancelDelegate1, this); - } - - TaskTracker.TrackActiveTask(this, 3); - RunOther(other).Forget(); - } - - public TSource Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (exception != null) - { - return UniTask.FromException(exception); - } - - if (cancellationToken1.IsCancellationRequested) - { - return UniTask.FromCanceled(cancellationToken1); - } - - if (enumerator == null) - { - enumerator = source.GetAsyncEnumerator(cancellationToken1); - } - completionSource.Reset(); - - if (completed) - { - SourceMoveNext(); - } - return new UniTask(this, completionSource.Version); - } - - void SourceMoveNext() - { - try - { - LOOP: - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - continueNext = true; - MoveNextCore(this); - if (continueNext) - { - continueNext = false; - goto LOOP; - } - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - } - - static void MoveNextCore(object state) - { - var self = (_SkipUntil)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - self.Current = self.enumerator.Current; - self.completionSource.TrySetResult(true); - if (self.continueNext) - { - self.SourceMoveNext(); - } - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - - async UniTaskVoid RunOther(UniTask other) - { - try - { - await other; - completed = true; - SourceMoveNext(); - } - catch (Exception ex) - { - exception = ex; - completionSource.TrySetException(ex); - } - } - - static void OnCanceled1(object state) - { - var self = (_SkipUntil)state; - self.completionSource.TrySetCanceled(self.cancellationToken1); - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - cancellationTokenRegistration1.Dispose(); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/SkipUntil.cs.meta b/VirtueSky/UniTask/Runtime/Linq/SkipUntil.cs.meta deleted file mode 100644 index 0772ed01..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/SkipUntil.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: de932d79c8d9f3841a066d05ff29edc9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/SkipUntilCanceled.cs b/VirtueSky/UniTask/Runtime/Linq/SkipUntilCanceled.cs deleted file mode 100644 index cf4dd18f..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/SkipUntilCanceled.cs +++ /dev/null @@ -1,173 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable SkipUntilCanceled(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return new SkipUntilCanceled(source, cancellationToken); - } - } - - internal sealed class SkipUntilCanceled : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly CancellationToken cancellationToken; - - public SkipUntilCanceled(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - this.source = source; - this.cancellationToken = cancellationToken; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _SkipUntilCanceled(source, this.cancellationToken, cancellationToken); - } - - sealed class _SkipUntilCanceled : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action CancelDelegate1 = OnCanceled1; - static readonly Action CancelDelegate2 = OnCanceled2; - static readonly Action MoveNextCoreDelegate = MoveNextCore; - - readonly IUniTaskAsyncEnumerable source; - CancellationToken cancellationToken1; - CancellationToken cancellationToken2; - CancellationTokenRegistration cancellationTokenRegistration1; - CancellationTokenRegistration cancellationTokenRegistration2; - - int isCanceled; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - bool continueNext; - - public _SkipUntilCanceled(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken1, CancellationToken cancellationToken2) - { - this.source = source; - this.cancellationToken1 = cancellationToken1; - this.cancellationToken2 = cancellationToken2; - if (cancellationToken1.CanBeCanceled) - { - this.cancellationTokenRegistration1 = cancellationToken1.RegisterWithoutCaptureExecutionContext(CancelDelegate1, this); - } - if (cancellationToken1 != cancellationToken2 && cancellationToken2.CanBeCanceled) - { - this.cancellationTokenRegistration2 = cancellationToken2.RegisterWithoutCaptureExecutionContext(CancelDelegate2, this); - } - TaskTracker.TrackActiveTask(this, 3); - } - - public TSource Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (enumerator == null) - { - if (cancellationToken1.IsCancellationRequested) isCanceled = 1; - if (cancellationToken2.IsCancellationRequested) isCanceled = 1; - enumerator = source.GetAsyncEnumerator(cancellationToken2); // use only AsyncEnumerator provided token. - } - completionSource.Reset(); - - if (isCanceled != 0) - { - SourceMoveNext(); - } - return new UniTask(this, completionSource.Version); - } - - void SourceMoveNext() - { - try - { - LOOP: - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - continueNext = true; - MoveNextCore(this); - if (continueNext) - { - continueNext = false; - goto LOOP; - } - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - } - - static void MoveNextCore(object state) - { - var self = (_SkipUntilCanceled)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - self.Current = self.enumerator.Current; - self.completionSource.TrySetResult(true); - if (self.continueNext) - { - self.SourceMoveNext(); - } - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - - static void OnCanceled1(object state) - { - var self = (_SkipUntilCanceled)state; - if (self.isCanceled == 0) - { - if (Interlocked.Increment(ref self.isCanceled) == 1) - { - self.cancellationTokenRegistration2.Dispose(); - self.SourceMoveNext(); - } - } - } - - static void OnCanceled2(object state) - { - var self = (_SkipUntilCanceled)state; - if (self.isCanceled == 0) - { - if (Interlocked.Increment(ref self.isCanceled) == 1) - { - self.cancellationTokenRegistration2.Dispose(); - self.SourceMoveNext(); - } - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - cancellationTokenRegistration1.Dispose(); - cancellationTokenRegistration2.Dispose(); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/SkipUntilCanceled.cs.meta b/VirtueSky/UniTask/Runtime/Linq/SkipUntilCanceled.cs.meta deleted file mode 100644 index 9f67181d..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/SkipUntilCanceled.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4b1a778aef7150d47b93a49aa1bc34ae -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/SkipWhile.cs b/VirtueSky/UniTask/Runtime/Linq/SkipWhile.cs deleted file mode 100644 index b27ffdbf..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/SkipWhile.cs +++ /dev/null @@ -1,379 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable SkipWhile(this IUniTaskAsyncEnumerable source, Func predicate) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return new SkipWhile(source, predicate); - } - - public static IUniTaskAsyncEnumerable SkipWhile(this IUniTaskAsyncEnumerable source, Func predicate) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return new SkipWhileInt(source, predicate); - } - - public static IUniTaskAsyncEnumerable SkipWhileAwait(this IUniTaskAsyncEnumerable source, Func> predicate) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return new SkipWhileAwait(source, predicate); - } - - public static IUniTaskAsyncEnumerable SkipWhileAwait(this IUniTaskAsyncEnumerable source, Func> predicate) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return new SkipWhileIntAwait(source, predicate); - } - - public static IUniTaskAsyncEnumerable SkipWhileAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> predicate) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return new SkipWhileAwaitWithCancellation(source, predicate); - } - - public static IUniTaskAsyncEnumerable SkipWhileAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> predicate) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return new SkipWhileIntAwaitWithCancellation(source, predicate); - } - } - - internal sealed class SkipWhile : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func predicate; - - public SkipWhile(IUniTaskAsyncEnumerable source, Func predicate) - { - this.source = source; - this.predicate = predicate; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _SkipWhile(source, predicate, cancellationToken); - } - - class _SkipWhile : AsyncEnumeratorBase - { - Func predicate; - - public _SkipWhile(IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken) - - : base(source, cancellationToken) - { - this.predicate = predicate; - } - - protected override bool TryMoveNextCore(bool sourceHasCurrent, out bool result) - { - if (sourceHasCurrent) - { - if (predicate == null || !predicate(SourceCurrent)) - { - predicate = null; - Current = SourceCurrent; - result = true; - return true; - } - else - { - result = default; - return false; - } - } - - result = false; - return true; - } - } - } - - internal sealed class SkipWhileInt : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func predicate; - - public SkipWhileInt(IUniTaskAsyncEnumerable source, Func predicate) - { - this.source = source; - this.predicate = predicate; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _SkipWhileInt(source, predicate, cancellationToken); - } - - class _SkipWhileInt : AsyncEnumeratorBase - { - Func predicate; - int index; - - public _SkipWhileInt(IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken) - - : base(source, cancellationToken) - { - this.predicate = predicate; - } - - protected override bool TryMoveNextCore(bool sourceHasCurrent, out bool result) - { - if (sourceHasCurrent) - { - if (predicate == null || !predicate(SourceCurrent, checked(index++))) - { - predicate = null; - Current = SourceCurrent; - result = true; - return true; - } - else - { - result = default; - return false; - } - } - - result = false; - return true; - } - } - } - - internal sealed class SkipWhileAwait : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> predicate; - - public SkipWhileAwait(IUniTaskAsyncEnumerable source, Func> predicate) - { - this.source = source; - this.predicate = predicate; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _SkipWhileAwait(source, predicate, cancellationToken); - } - - class _SkipWhileAwait : AsyncEnumeratorAwaitSelectorBase - { - Func> predicate; - - public _SkipWhileAwait(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - - : base(source, cancellationToken) - { - this.predicate = predicate; - } - - protected override UniTask TransformAsync(TSource sourceCurrent) - { - if (predicate == null) - { - return CompletedTasks.False; - } - - return predicate(sourceCurrent); - } - - protected override bool TrySetCurrentCore(bool awaitResult, out bool terminateIteration) - { - if (!awaitResult) - { - predicate = null; - Current = SourceCurrent; - terminateIteration= false; - return true; - } - else - { - terminateIteration= false; - return false; - } - } - } - } - - internal sealed class SkipWhileIntAwait : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> predicate; - - public SkipWhileIntAwait(IUniTaskAsyncEnumerable source, Func> predicate) - { - this.source = source; - this.predicate = predicate; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _SkipWhileIntAwait(source, predicate, cancellationToken); - } - - class _SkipWhileIntAwait : AsyncEnumeratorAwaitSelectorBase - { - Func> predicate; - int index; - - public _SkipWhileIntAwait(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - - : base(source, cancellationToken) - { - this.predicate = predicate; - } - - protected override UniTask TransformAsync(TSource sourceCurrent) - { - if (predicate == null) - { - return CompletedTasks.False; - } - - return predicate(sourceCurrent, checked(index++)); - } - - protected override bool TrySetCurrentCore(bool awaitResult, out bool terminateIteration) - { - terminateIteration= false; - if (!awaitResult) - { - predicate = null; - Current = SourceCurrent; - return true; - } - else - { - return false; - } - } - } - } - - internal sealed class SkipWhileAwaitWithCancellation : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> predicate; - - public SkipWhileAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> predicate) - { - this.source = source; - this.predicate = predicate; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _SkipWhileAwaitWithCancellation(source, predicate, cancellationToken); - } - - class _SkipWhileAwaitWithCancellation : AsyncEnumeratorAwaitSelectorBase - { - Func> predicate; - - public _SkipWhileAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - - : base(source, cancellationToken) - { - this.predicate = predicate; - } - - protected override UniTask TransformAsync(TSource sourceCurrent) - { - if (predicate == null) - { - return CompletedTasks.False; - } - - return predicate(sourceCurrent, cancellationToken); - } - - protected override bool TrySetCurrentCore(bool awaitResult, out bool terminateIteration) - { - terminateIteration= false; - if (!awaitResult) - { - predicate = null; - Current = SourceCurrent; - return true; - } - else - { - return false; - } - } - } - } - - internal sealed class SkipWhileIntAwaitWithCancellation : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> predicate; - - public SkipWhileIntAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> predicate) - { - this.source = source; - this.predicate = predicate; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _SkipWhileIntAwaitWithCancellation(source, predicate, cancellationToken); - } - - class _SkipWhileIntAwaitWithCancellation : AsyncEnumeratorAwaitSelectorBase - { - Func> predicate; - int index; - - public _SkipWhileIntAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - - : base(source, cancellationToken) - { - this.predicate = predicate; - } - - protected override UniTask TransformAsync(TSource sourceCurrent) - { - if (predicate == null) - { - return CompletedTasks.False; - } - - return predicate(sourceCurrent, checked(index++), cancellationToken); - } - - protected override bool TrySetCurrentCore(bool awaitResult, out bool terminateIteration) - { - terminateIteration= false; - if (!awaitResult) - { - predicate = null; - Current = SourceCurrent; - return true; - } - else - { - return false; - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/SkipWhile.cs.meta b/VirtueSky/UniTask/Runtime/Linq/SkipWhile.cs.meta deleted file mode 100644 index f2b210a9..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/SkipWhile.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0b74b9fe361bf7148b51a29c8b2561e8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Subscribe.cs b/VirtueSky/UniTask/Runtime/Linq/Subscribe.cs deleted file mode 100644 index 5155be9d..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Subscribe.cs +++ /dev/null @@ -1,536 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; -using Subscribes = VirtueSky.Threading.Tasks.Linq.Subscribe; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - // OnNext - - public static IDisposable Subscribe(this IUniTaskAsyncEnumerable source, Action action) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(action, nameof(action)); - - var cts = new CancellationTokenDisposable(); - Subscribes.SubscribeCore(source, action, Subscribes.NopError, Subscribes.NopCompleted, cts.Token).Forget(); - return cts; - } - - public static IDisposable Subscribe(this IUniTaskAsyncEnumerable source, Func action) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(action, nameof(action)); - - var cts = new CancellationTokenDisposable(); - Subscribes.SubscribeCore(source, action, Subscribes.NopError, Subscribes.NopCompleted, cts.Token).Forget(); - return cts; - } - - public static IDisposable Subscribe(this IUniTaskAsyncEnumerable source, Func action) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(action, nameof(action)); - - var cts = new CancellationTokenDisposable(); - Subscribes.SubscribeCore(source, action, Subscribes.NopError, Subscribes.NopCompleted, cts.Token).Forget(); - return cts; - } - - public static void Subscribe(this IUniTaskAsyncEnumerable source, Action action, CancellationToken cancellationToken) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(action, nameof(action)); - - Subscribes.SubscribeCore(source, action, Subscribes.NopError, Subscribes.NopCompleted, cancellationToken).Forget(); - } - - public static void Subscribe(this IUniTaskAsyncEnumerable source, Func action, CancellationToken cancellationToken) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(action, nameof(action)); - - Subscribes.SubscribeCore(source, action, Subscribes.NopError, Subscribes.NopCompleted, cancellationToken).Forget(); - } - - public static void Subscribe(this IUniTaskAsyncEnumerable source, Func action, CancellationToken cancellationToken) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(action, nameof(action)); - - Subscribes.SubscribeCore(source, action, Subscribes.NopError, Subscribes.NopCompleted, cancellationToken).Forget(); - } - - public static IDisposable SubscribeAwait(this IUniTaskAsyncEnumerable source, Func onNext) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - - var cts = new CancellationTokenDisposable(); - Subscribes.SubscribeAwaitCore(source, onNext, Subscribes.NopError, Subscribes.NopCompleted, cts.Token).Forget(); - return cts; - } - - public static void SubscribeAwait(this IUniTaskAsyncEnumerable source, Func onNext, CancellationToken cancellationToken) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - - Subscribes.SubscribeAwaitCore(source, onNext, Subscribes.NopError, Subscribes.NopCompleted, cancellationToken).Forget(); - } - - public static IDisposable SubscribeAwait(this IUniTaskAsyncEnumerable source, Func onNext) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - - var cts = new CancellationTokenDisposable(); - Subscribes.SubscribeAwaitCore(source, onNext, Subscribes.NopError, Subscribes.NopCompleted, cts.Token).Forget(); - return cts; - } - - public static void SubscribeAwait(this IUniTaskAsyncEnumerable source, Func onNext, CancellationToken cancellationToken) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - - Subscribes.SubscribeAwaitCore(source, onNext, Subscribes.NopError, Subscribes.NopCompleted, cancellationToken).Forget(); - } - - // OnNext, OnError - - public static IDisposable Subscribe(this IUniTaskAsyncEnumerable source, Action onNext, Action onError) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - Error.ThrowArgumentNullException(onError, nameof(onError)); - - var cts = new CancellationTokenDisposable(); - Subscribes.SubscribeCore(source, onNext, onError, Subscribes.NopCompleted, cts.Token).Forget(); - return cts; - } - - public static IDisposable Subscribe(this IUniTaskAsyncEnumerable source, Func onNext, Action onError) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - Error.ThrowArgumentNullException(onError, nameof(onError)); - - var cts = new CancellationTokenDisposable(); - Subscribes.SubscribeCore(source, onNext, onError, Subscribes.NopCompleted, cts.Token).Forget(); - return cts; - } - - public static void Subscribe(this IUniTaskAsyncEnumerable source, Action onNext, Action onError, CancellationToken cancellationToken) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - Error.ThrowArgumentNullException(onError, nameof(onError)); - - Subscribes.SubscribeCore(source, onNext, onError, Subscribes.NopCompleted, cancellationToken).Forget(); - } - - public static void Subscribe(this IUniTaskAsyncEnumerable source, Func onNext, Action onError, CancellationToken cancellationToken) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - Error.ThrowArgumentNullException(onError, nameof(onError)); - - Subscribes.SubscribeCore(source, onNext, onError, Subscribes.NopCompleted, cancellationToken).Forget(); - } - - public static IDisposable SubscribeAwait(this IUniTaskAsyncEnumerable source, Func onNext, Action onError) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - Error.ThrowArgumentNullException(onError, nameof(onError)); - - var cts = new CancellationTokenDisposable(); - Subscribes.SubscribeAwaitCore(source, onNext, onError, Subscribes.NopCompleted, cts.Token).Forget(); - return cts; - } - - public static void SubscribeAwait(this IUniTaskAsyncEnumerable source, Func onNext, Action onError, CancellationToken cancellationToken) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - Error.ThrowArgumentNullException(onError, nameof(onError)); - - Subscribes.SubscribeAwaitCore(source, onNext, onError, Subscribes.NopCompleted, cancellationToken).Forget(); - } - - public static IDisposable SubscribeAwait(this IUniTaskAsyncEnumerable source, Func onNext, Action onError) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - Error.ThrowArgumentNullException(onError, nameof(onError)); - - var cts = new CancellationTokenDisposable(); - Subscribes.SubscribeAwaitCore(source, onNext, onError, Subscribes.NopCompleted, cts.Token).Forget(); - return cts; - } - - public static void SubscribeAwait(this IUniTaskAsyncEnumerable source, Func onNext, Action onError, CancellationToken cancellationToken) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - Error.ThrowArgumentNullException(onError, nameof(onError)); - - Subscribes.SubscribeAwaitCore(source, onNext, onError, Subscribes.NopCompleted, cancellationToken).Forget(); - } - - // OnNext, OnCompleted - - public static IDisposable Subscribe(this IUniTaskAsyncEnumerable source, Action onNext, Action onCompleted) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - Error.ThrowArgumentNullException(onCompleted, nameof(onCompleted)); - - var cts = new CancellationTokenDisposable(); - Subscribes.SubscribeCore(source, onNext, Subscribes.NopError, onCompleted, cts.Token).Forget(); - return cts; - } - - public static IDisposable Subscribe(this IUniTaskAsyncEnumerable source, Func onNext, Action onCompleted) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - Error.ThrowArgumentNullException(onCompleted, nameof(onCompleted)); - - var cts = new CancellationTokenDisposable(); - Subscribes.SubscribeCore(source, onNext, Subscribes.NopError, onCompleted, cts.Token).Forget(); - return cts; - } - - public static void Subscribe(this IUniTaskAsyncEnumerable source, Action onNext, Action onCompleted, CancellationToken cancellationToken) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - Error.ThrowArgumentNullException(onCompleted, nameof(onCompleted)); - - Subscribes.SubscribeCore(source, onNext, Subscribes.NopError, onCompleted, cancellationToken).Forget(); - } - - public static void Subscribe(this IUniTaskAsyncEnumerable source, Func onNext, Action onCompleted, CancellationToken cancellationToken) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - Error.ThrowArgumentNullException(onCompleted, nameof(onCompleted)); - - Subscribes.SubscribeCore(source, onNext, Subscribes.NopError, onCompleted, cancellationToken).Forget(); - } - - public static IDisposable SubscribeAwait(this IUniTaskAsyncEnumerable source, Func onNext, Action onCompleted) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - Error.ThrowArgumentNullException(onCompleted, nameof(onCompleted)); - - var cts = new CancellationTokenDisposable(); - Subscribes.SubscribeAwaitCore(source, onNext, Subscribes.NopError, onCompleted, cts.Token).Forget(); - return cts; - } - - public static void SubscribeAwait(this IUniTaskAsyncEnumerable source, Func onNext, Action onCompleted, CancellationToken cancellationToken) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - Error.ThrowArgumentNullException(onCompleted, nameof(onCompleted)); - - Subscribes.SubscribeAwaitCore(source, onNext, Subscribes.NopError, onCompleted, cancellationToken).Forget(); - } - - public static IDisposable SubscribeAwait(this IUniTaskAsyncEnumerable source, Func onNext, Action onCompleted) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - Error.ThrowArgumentNullException(onCompleted, nameof(onCompleted)); - - var cts = new CancellationTokenDisposable(); - Subscribes.SubscribeAwaitCore(source, onNext, Subscribes.NopError, onCompleted, cts.Token).Forget(); - return cts; - } - - public static void SubscribeAwait(this IUniTaskAsyncEnumerable source, Func onNext, Action onCompleted, CancellationToken cancellationToken) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(onNext, nameof(onNext)); - Error.ThrowArgumentNullException(onCompleted, nameof(onCompleted)); - - Subscribes.SubscribeAwaitCore(source, onNext, Subscribes.NopError, onCompleted, cancellationToken).Forget(); - } - - // IObserver - - public static IDisposable Subscribe(this IUniTaskAsyncEnumerable source, IObserver observer) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(observer, nameof(observer)); - - var cts = new CancellationTokenDisposable(); - Subscribes.SubscribeCore(source, observer, cts.Token).Forget(); - return cts; - } - - public static void Subscribe(this IUniTaskAsyncEnumerable source, IObserver observer, CancellationToken cancellationToken) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(observer, nameof(observer)); - - Subscribes.SubscribeCore(source, observer, cancellationToken).Forget(); - } - } - - internal sealed class CancellationTokenDisposable : IDisposable - { - readonly CancellationTokenSource cts = new CancellationTokenSource(); - - public CancellationToken Token => cts.Token; - - public void Dispose() - { - if (!cts.IsCancellationRequested) - { - cts.Cancel(); - } - } - } - - internal static class Subscribe - { - public static readonly Action NopError = _ => { }; - public static readonly Action NopCompleted = () => { }; - - public static async UniTaskVoid SubscribeCore(IUniTaskAsyncEnumerable source, Action onNext, Action onError, Action onCompleted, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - try - { - onNext(e.Current); - } - catch (Exception ex) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - } - } - onCompleted(); - } - catch (Exception ex) - { - if (onError == NopError) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - return; - } - - if (ex is OperationCanceledException) return; - - onError(ex); - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTaskVoid SubscribeCore(IUniTaskAsyncEnumerable source, Func onNext, Action onError, Action onCompleted, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - try - { - onNext(e.Current).Forget(); - } - catch (Exception ex) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - } - } - onCompleted(); - } - catch (Exception ex) - { - if (onError == NopError) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - return; - } - - if (ex is OperationCanceledException) return; - - onError(ex); - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTaskVoid SubscribeCore(IUniTaskAsyncEnumerable source, Func onNext, Action onError, Action onCompleted, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - try - { - onNext(e.Current, cancellationToken).Forget(); - } - catch (Exception ex) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - } - } - onCompleted(); - } - catch (Exception ex) - { - if (onError == NopError) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - return; - } - - if (ex is OperationCanceledException) return; - - onError(ex); - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTaskVoid SubscribeCore(IUniTaskAsyncEnumerable source, IObserver observer, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - try - { - observer.OnNext(e.Current); - } - catch (Exception ex) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - } - } - observer.OnCompleted(); - } - catch (Exception ex) - { - if (ex is OperationCanceledException) return; - - observer.OnError(ex); - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTaskVoid SubscribeAwaitCore(IUniTaskAsyncEnumerable source, Func onNext, Action onError, Action onCompleted, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - try - { - await onNext(e.Current); - } - catch (Exception ex) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - } - } - onCompleted(); - } - catch (Exception ex) - { - if (onError == NopError) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - return; - } - - if (ex is OperationCanceledException) return; - - onError(ex); - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - public static async UniTaskVoid SubscribeAwaitCore(IUniTaskAsyncEnumerable source, Func onNext, Action onError, Action onCompleted, CancellationToken cancellationToken) - { - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - try - { - await onNext(e.Current, cancellationToken); - } - catch (Exception ex) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - } - } - onCompleted(); - } - catch (Exception ex) - { - if (onError == NopError) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - return; - } - - if (ex is OperationCanceledException) return; - - onError(ex); - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Subscribe.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Subscribe.cs.meta deleted file mode 100644 index ea835671..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Subscribe.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 263479eb04c189741931fc0e2f615c2d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Sum.cs b/VirtueSky/UniTask/Runtime/Linq/Sum.cs deleted file mode 100644 index 33cc676f..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Sum.cs +++ /dev/null @@ -1,1244 +0,0 @@ -using System; -using System.Threading; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Sum.SumAsync(source, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Sum.SumAsync(source, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Sum.SumAsync(source, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Sum.SumAsync(source, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Sum.SumAsync(source, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Sum.SumAsync(source, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Sum.SumAsync(source, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Sum.SumAsync(source, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Sum.SumAsync(source, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return Sum.SumAsync(source, cancellationToken); - } - - public static UniTask SumAsync(this IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitAsync(source, selector, cancellationToken); - } - - public static UniTask SumAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(selector)); - - return Sum.SumAwaitWithCancellationAsync(source, selector, cancellationToken); - } - - } - - internal static class Sum - { - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Int32 sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += e.Current; - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Int32 sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += selector(e.Current); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int32 sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current)); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int32 sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current, cancellationToken)); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Int64 sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += e.Current; - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Int64 sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += selector(e.Current); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int64 sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current)); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int64 sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current, cancellationToken)); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Single sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += e.Current; - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Single sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += selector(e.Current); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Single sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current)); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Single sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current, cancellationToken)); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Double sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += e.Current; - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Double sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += selector(e.Current); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Double sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current)); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Double sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current, cancellationToken)); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Decimal sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += e.Current; - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Decimal sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += selector(e.Current); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Decimal sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current)); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Decimal sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current, cancellationToken)); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Int32? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += e.Current.GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Int32? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += selector(e.Current).GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int32? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current)).GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int32? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current, cancellationToken)).GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Int64? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += e.Current.GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Int64? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += selector(e.Current).GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int64? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current)).GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Int64? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current, cancellationToken)).GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Single? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += e.Current.GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Single? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += selector(e.Current).GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Single? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current)).GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Single? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current, cancellationToken)).GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Double? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += e.Current.GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Double? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += selector(e.Current).GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Double? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current)).GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Double? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current, cancellationToken)).GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Decimal? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += e.Current.GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAsync(IUniTaskAsyncEnumerable source, Func selector, CancellationToken cancellationToken) - { - Decimal? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += selector(e.Current).GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Decimal? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current)).GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - public static async UniTask SumAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> selector, CancellationToken cancellationToken) - { - Decimal? sum = default; - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - sum += (await selector(e.Current, cancellationToken)).GetValueOrDefault(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return sum; - } - - } -} diff --git a/VirtueSky/UniTask/Runtime/Linq/Sum.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Sum.cs.meta deleted file mode 100644 index 5331e349..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Sum.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4149754066a21a341be58c04357061f6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Take.cs b/VirtueSky/UniTask/Runtime/Linq/Take.cs deleted file mode 100644 index 0c52e2c2..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Take.cs +++ /dev/null @@ -1,124 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Take(this IUniTaskAsyncEnumerable source, Int32 count) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return new Take(source, count); - } - } - - internal sealed class Take : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly int count; - - public Take(IUniTaskAsyncEnumerable source, int count) - { - this.source = source; - this.count = count; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Take(source, count, cancellationToken); - } - - sealed class _Take : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action MoveNextCoreDelegate = MoveNextCore; - - readonly IUniTaskAsyncEnumerable source; - readonly int count; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - int index; - - public _Take(IUniTaskAsyncEnumerable source, int count, CancellationToken cancellationToken) - { - this.source = source; - this.count = count; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TSource Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - - if (enumerator == null) - { - enumerator = source.GetAsyncEnumerator(cancellationToken); - } - - if (checked(index) >= count) - { - return CompletedTasks.False; - } - - completionSource.Reset(); - SourceMoveNext(); - return new UniTask(this, completionSource.Version); - } - - void SourceMoveNext() - { - try - { - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - MoveNextCore(this); - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - } - - static void MoveNextCore(object state) - { - var self = (_Take)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - self.index++; - self.Current = self.enumerator.Current; - self.completionSource.TrySetResult(true); - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Take.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Take.cs.meta deleted file mode 100644 index 1cc91ab0..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Take.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 42f02cb84e5875b488304755d0e1383d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/TakeLast.cs b/VirtueSky/UniTask/Runtime/Linq/TakeLast.cs deleted file mode 100644 index 432b4c3a..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/TakeLast.cs +++ /dev/null @@ -1,175 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable TakeLast(this IUniTaskAsyncEnumerable source, Int32 count) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - // non take. - if (count <= 0) - { - return Empty(); - } - - return new TakeLast(source, count); - } - } - - internal sealed class TakeLast : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly int count; - - public TakeLast(IUniTaskAsyncEnumerable source, int count) - { - this.source = source; - this.count = count; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _TakeLast(source, count, cancellationToken); - } - - sealed class _TakeLast : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action MoveNextCoreDelegate = MoveNextCore; - - readonly IUniTaskAsyncEnumerable source; - readonly int count; - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - Queue queue; - - bool iterateCompleted; - bool continueNext; - - public _TakeLast(IUniTaskAsyncEnumerable source, int count, CancellationToken cancellationToken) - { - this.source = source; - this.count = count; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TSource Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - - if (enumerator == null) - { - enumerator = source.GetAsyncEnumerator(cancellationToken); - queue = new Queue(); - } - - completionSource.Reset(); - SourceMoveNext(); - return new UniTask(this, completionSource.Version); - } - - void SourceMoveNext() - { - if (iterateCompleted) - { - if (queue.Count > 0) - { - Current = queue.Dequeue(); - completionSource.TrySetResult(true); - } - else - { - completionSource.TrySetResult(false); - } - - return; - } - - try - { - LOOP: - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - continueNext = true; - MoveNextCore(this); - if (continueNext) - { - continueNext = false; - goto LOOP; // avoid recursive - } - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - } - - - static void MoveNextCore(object state) - { - var self = (_TakeLast)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - if (self.queue.Count < self.count) - { - self.queue.Enqueue(self.enumerator.Current); - - if (!self.continueNext) - { - self.SourceMoveNext(); - } - } - else - { - self.queue.Dequeue(); - self.queue.Enqueue(self.enumerator.Current); - - if (!self.continueNext) - { - self.SourceMoveNext(); - } - } - } - else - { - self.continueNext = false; - self.iterateCompleted = true; - self.SourceMoveNext(); - } - } - else - { - self.continueNext = false; - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/TakeLast.cs.meta b/VirtueSky/UniTask/Runtime/Linq/TakeLast.cs.meta deleted file mode 100644 index d80037f4..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/TakeLast.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 510aa9fd35b45fc40bcdb7e59f01fd1b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/TakeUntil.cs b/VirtueSky/UniTask/Runtime/Linq/TakeUntil.cs deleted file mode 100644 index 07f6397f..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/TakeUntil.cs +++ /dev/null @@ -1,190 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable TakeUntil(this IUniTaskAsyncEnumerable source, UniTask other) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return new TakeUntil(source, other, null); - } - - public static IUniTaskAsyncEnumerable TakeUntil(this IUniTaskAsyncEnumerable source, Func other) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(source, nameof(other)); - - return new TakeUntil(source, default, other); - } - } - - internal sealed class TakeUntil : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly UniTask other; - readonly Func other2; - - public TakeUntil(IUniTaskAsyncEnumerable source, UniTask other, Func other2) - { - this.source = source; - this.other = other; - this.other2 = other2; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - if (other2 != null) - { - return new _TakeUntil(source, this.other2(cancellationToken), cancellationToken); - } - else - { - return new _TakeUntil(source, this.other, cancellationToken); - } - } - - sealed class _TakeUntil : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action CancelDelegate1 = OnCanceled1; - static readonly Action MoveNextCoreDelegate = MoveNextCore; - - readonly IUniTaskAsyncEnumerable source; - CancellationToken cancellationToken1; - CancellationTokenRegistration cancellationTokenRegistration1; - - bool completed; - Exception exception; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - - public _TakeUntil(IUniTaskAsyncEnumerable source, UniTask other, CancellationToken cancellationToken1) - { - this.source = source; - this.cancellationToken1 = cancellationToken1; - - if (cancellationToken1.CanBeCanceled) - { - this.cancellationTokenRegistration1 = cancellationToken1.RegisterWithoutCaptureExecutionContext(CancelDelegate1, this); - } - - TaskTracker.TrackActiveTask(this, 3); - - RunOther(other).Forget(); - } - - public TSource Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (completed) - { - return CompletedTasks.False; - } - - if (exception != null) - { - return UniTask.FromException(exception); - } - - if (cancellationToken1.IsCancellationRequested) - { - return UniTask.FromCanceled(cancellationToken1); - } - - if (enumerator == null) - { - enumerator = source.GetAsyncEnumerator(cancellationToken1); - } - - completionSource.Reset(); - SourceMoveNext(); - return new UniTask(this, completionSource.Version); - } - - void SourceMoveNext() - { - try - { - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - MoveNextCore(this); - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - } - - static void MoveNextCore(object state) - { - var self = (_TakeUntil)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - if (self.exception != null) - { - self.completionSource.TrySetException(self.exception); - } - else if (self.cancellationToken1.IsCancellationRequested) - { - self.completionSource.TrySetCanceled(self.cancellationToken1); - } - else - { - self.Current = self.enumerator.Current; - self.completionSource.TrySetResult(true); - } - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - - async UniTaskVoid RunOther(UniTask other) - { - try - { - await other; - completed = true; - completionSource.TrySetResult(false); - } - catch (Exception ex) - { - exception = ex; - completionSource.TrySetException(ex); - } - } - - static void OnCanceled1(object state) - { - var self = (_TakeUntil)state; - self.completionSource.TrySetCanceled(self.cancellationToken1); - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - cancellationTokenRegistration1.Dispose(); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/TakeUntil.cs.meta b/VirtueSky/UniTask/Runtime/Linq/TakeUntil.cs.meta deleted file mode 100644 index 44cf63e1..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/TakeUntil.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 12bda324162f15349afefc2c152ac07f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/TakeUntilCanceled.cs b/VirtueSky/UniTask/Runtime/Linq/TakeUntilCanceled.cs deleted file mode 100644 index 1fc92f96..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/TakeUntilCanceled.cs +++ /dev/null @@ -1,164 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable TakeUntilCanceled(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return new TakeUntilCanceled(source, cancellationToken); - } - } - - internal sealed class TakeUntilCanceled : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly CancellationToken cancellationToken; - - public TakeUntilCanceled(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - this.source = source; - this.cancellationToken = cancellationToken; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _TakeUntilCanceled(source, this.cancellationToken, cancellationToken); - } - - sealed class _TakeUntilCanceled : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action CancelDelegate1 = OnCanceled1; - static readonly Action CancelDelegate2 = OnCanceled2; - static readonly Action MoveNextCoreDelegate = MoveNextCore; - - readonly IUniTaskAsyncEnumerable source; - CancellationToken cancellationToken1; - CancellationToken cancellationToken2; - CancellationTokenRegistration cancellationTokenRegistration1; - CancellationTokenRegistration cancellationTokenRegistration2; - - bool isCanceled; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - - public _TakeUntilCanceled(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken1, CancellationToken cancellationToken2) - { - this.source = source; - this.cancellationToken1 = cancellationToken1; - this.cancellationToken2 = cancellationToken2; - - if (cancellationToken1.CanBeCanceled) - { - this.cancellationTokenRegistration1 = cancellationToken1.RegisterWithoutCaptureExecutionContext(CancelDelegate1, this); - } - - if (cancellationToken1 != cancellationToken2 && cancellationToken2.CanBeCanceled) - { - this.cancellationTokenRegistration2 = cancellationToken2.RegisterWithoutCaptureExecutionContext(CancelDelegate2, this); - } - TaskTracker.TrackActiveTask(this, 3); - } - - public TSource Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (cancellationToken1.IsCancellationRequested) isCanceled = true; - if (cancellationToken2.IsCancellationRequested) isCanceled = true; - - if (enumerator == null) - { - enumerator = source.GetAsyncEnumerator(cancellationToken2); // use only AsyncEnumerator provided token. - } - - if (isCanceled) return CompletedTasks.False; - - completionSource.Reset(); - SourceMoveNext(); - return new UniTask(this, completionSource.Version); - } - - void SourceMoveNext() - { - try - { - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - MoveNextCore(this); - } - else - { - awaiter.SourceOnCompleted(MoveNextCoreDelegate, this); - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - } - } - - static void MoveNextCore(object state) - { - var self = (_TakeUntilCanceled)state; - - if (self.TryGetResult(self.awaiter, out var result)) - { - if (result) - { - if (self.isCanceled) - { - self.completionSource.TrySetResult(false); - } - else - { - self.Current = self.enumerator.Current; - self.completionSource.TrySetResult(true); - } - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - - static void OnCanceled1(object state) - { - var self = (_TakeUntilCanceled)state; - if (!self.isCanceled) - { - self.cancellationTokenRegistration2.Dispose(); - self.completionSource.TrySetResult(false); - } - } - - static void OnCanceled2(object state) - { - var self = (_TakeUntilCanceled)state; - if (!self.isCanceled) - { - self.cancellationTokenRegistration1.Dispose(); - self.completionSource.TrySetResult(false); - } - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - cancellationTokenRegistration1.Dispose(); - cancellationTokenRegistration2.Dispose(); - if (enumerator != null) - { - return enumerator.DisposeAsync(); - } - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/TakeUntilCanceled.cs.meta b/VirtueSky/UniTask/Runtime/Linq/TakeUntilCanceled.cs.meta deleted file mode 100644 index 4a89be54..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/TakeUntilCanceled.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e82f498cf3a1df04cbf646773fc11319 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/TakeWhile.cs b/VirtueSky/UniTask/Runtime/Linq/TakeWhile.cs deleted file mode 100644 index d200c3c8..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/TakeWhile.cs +++ /dev/null @@ -1,342 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable TakeWhile(this IUniTaskAsyncEnumerable source, Func predicate) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return new TakeWhile(source, predicate); - } - - public static IUniTaskAsyncEnumerable TakeWhile(this IUniTaskAsyncEnumerable source, Func predicate) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return new TakeWhileInt(source, predicate); - } - - public static IUniTaskAsyncEnumerable TakeWhileAwait(this IUniTaskAsyncEnumerable source, Func> predicate) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return new TakeWhileAwait(source, predicate); - } - - public static IUniTaskAsyncEnumerable TakeWhileAwait(this IUniTaskAsyncEnumerable source, Func> predicate) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return new TakeWhileIntAwait(source, predicate); - } - - public static IUniTaskAsyncEnumerable TakeWhileAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> predicate) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return new TakeWhileAwaitWithCancellation(source, predicate); - } - - public static IUniTaskAsyncEnumerable TakeWhileAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> predicate) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return new TakeWhileIntAwaitWithCancellation(source, predicate); - } - } - - internal sealed class TakeWhile : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func predicate; - - public TakeWhile(IUniTaskAsyncEnumerable source, Func predicate) - { - this.source = source; - this.predicate = predicate; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _TakeWhile(source, predicate, cancellationToken); - } - - class _TakeWhile : AsyncEnumeratorBase - { - Func predicate; - - public _TakeWhile(IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken) - - : base(source, cancellationToken) - { - this.predicate = predicate; - } - - protected override bool TryMoveNextCore(bool sourceHasCurrent, out bool result) - { - if (sourceHasCurrent) - { - if (predicate(SourceCurrent)) - { - Current = SourceCurrent; - result = true; - return true; - } - } - - result = false; - return true; - } - } - } - - internal sealed class TakeWhileInt : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func predicate; - - public TakeWhileInt(IUniTaskAsyncEnumerable source, Func predicate) - { - this.source = source; - this.predicate = predicate; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _TakeWhileInt(source, predicate, cancellationToken); - } - - class _TakeWhileInt : AsyncEnumeratorBase - { - readonly Func predicate; - int index; - - public _TakeWhileInt(IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken) - - : base(source, cancellationToken) - { - this.predicate = predicate; - } - - protected override bool TryMoveNextCore(bool sourceHasCurrent, out bool result) - { - if (sourceHasCurrent) - { - if (predicate(SourceCurrent, checked(index++))) - { - Current = SourceCurrent; - result = true; - return true; - } - } - - result = false; - return true; - } - } - } - - internal sealed class TakeWhileAwait : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> predicate; - - public TakeWhileAwait(IUniTaskAsyncEnumerable source, Func> predicate) - { - this.source = source; - this.predicate = predicate; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _TakeWhileAwait(source, predicate, cancellationToken); - } - - class _TakeWhileAwait : AsyncEnumeratorAwaitSelectorBase - { - Func> predicate; - - public _TakeWhileAwait(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - : base(source, cancellationToken) - { - this.predicate = predicate; - } - - protected override UniTask TransformAsync(TSource sourceCurrent) - { - return predicate(sourceCurrent); - } - - protected override bool TrySetCurrentCore(bool awaitResult, out bool terminateIteration) - { - if (awaitResult) - { - Current = SourceCurrent; - terminateIteration = false; - return true; - } - else - { - terminateIteration = true; - return false; - } - } - } - } - - internal sealed class TakeWhileIntAwait : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> predicate; - - public TakeWhileIntAwait(IUniTaskAsyncEnumerable source, Func> predicate) - { - this.source = source; - this.predicate = predicate; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _TakeWhileIntAwait(source, predicate, cancellationToken); - } - - class _TakeWhileIntAwait : AsyncEnumeratorAwaitSelectorBase - { - readonly Func> predicate; - int index; - - public _TakeWhileIntAwait(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - : base(source, cancellationToken) - { - this.predicate = predicate; - } - - protected override UniTask TransformAsync(TSource sourceCurrent) - { - return predicate(sourceCurrent, checked(index++)); - } - - protected override bool TrySetCurrentCore(bool awaitResult, out bool terminateIteration) - { - if (awaitResult) - { - Current = SourceCurrent; - terminateIteration = false; - return true; - } - else - { - terminateIteration = true; - return false; - } - } - } - } - - internal sealed class TakeWhileAwaitWithCancellation : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> predicate; - - public TakeWhileAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> predicate) - { - this.source = source; - this.predicate = predicate; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _TakeWhileAwaitWithCancellation(source, predicate, cancellationToken); - } - - class _TakeWhileAwaitWithCancellation : AsyncEnumeratorAwaitSelectorBase - { - Func> predicate; - - public _TakeWhileAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - : base(source, cancellationToken) - { - this.predicate = predicate; - } - - protected override UniTask TransformAsync(TSource sourceCurrent) - { - return predicate(sourceCurrent, cancellationToken); - } - - protected override bool TrySetCurrentCore(bool awaitResult, out bool terminateIteration) - { - if (awaitResult) - { - Current = SourceCurrent; - terminateIteration = false; - return true; - } - else - { - terminateIteration = true; - return false; - } - } - } - } - - internal sealed class TakeWhileIntAwaitWithCancellation : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> predicate; - - public TakeWhileIntAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> predicate) - { - this.source = source; - this.predicate = predicate; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _TakeWhileIntAwaitWithCancellation(source, predicate, cancellationToken); - } - - class _TakeWhileIntAwaitWithCancellation : AsyncEnumeratorAwaitSelectorBase - { - readonly Func> predicate; - int index; - - public _TakeWhileIntAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - : base(source, cancellationToken) - { - this.predicate = predicate; - } - - protected override UniTask TransformAsync(TSource sourceCurrent) - { - return predicate(sourceCurrent, checked(index++), cancellationToken); - } - - protected override bool TrySetCurrentCore(bool awaitResult, out bool terminateIteration) - { - if (awaitResult) - { - Current = SourceCurrent; - terminateIteration = false; - return true; - } - else - { - terminateIteration = true; - return false; - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/TakeWhile.cs.meta b/VirtueSky/UniTask/Runtime/Linq/TakeWhile.cs.meta deleted file mode 100644 index f2173d59..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/TakeWhile.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: bca55adabcc4b3141b50b8b09634f764 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Throw.cs b/VirtueSky/UniTask/Runtime/Linq/Throw.cs deleted file mode 100644 index 43e0a453..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Throw.cs +++ /dev/null @@ -1,54 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Throw(Exception exception) - { - return new Throw(exception); - } - } - - internal class Throw : IUniTaskAsyncEnumerable - { - readonly Exception exception; - - public Throw(Exception exception) - { - this.exception = exception; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Throw(exception, cancellationToken); - } - - class _Throw : IUniTaskAsyncEnumerator - { - readonly Exception exception; - CancellationToken cancellationToken; - - public _Throw(Exception exception, CancellationToken cancellationToken) - { - this.exception = exception; - this.cancellationToken = cancellationToken; - } - - public TValue Current => default; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - return UniTask.FromException(exception); - } - - public UniTask DisposeAsync() - { - return default; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Throw.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Throw.cs.meta deleted file mode 100644 index c768ef1e..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Throw.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9d05a7d4f4161e549b4789e1022baae8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/ToArray.cs b/VirtueSky/UniTask/Runtime/Linq/ToArray.cs deleted file mode 100644 index aaf26ef2..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/ToArray.cs +++ /dev/null @@ -1,60 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask ToArrayAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return VirtueSky.Threading.Tasks.Linq.ToArray.ToArrayAsync(source, cancellationToken); - } - } - - internal static class ToArray - { - internal static async UniTask ToArrayAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - var pool = ArrayPool.Shared; - var array = pool.Rent(16); - - TSource[] result = default; - IUniTaskAsyncEnumerator e = default; - try - { - e = source.GetAsyncEnumerator(cancellationToken); - var i = 0; - while (await e.MoveNextAsync()) - { - ArrayPoolUtil.EnsureCapacity(ref array, i, pool); - array[i++] = e.Current; - } - - if (i == 0) - { - result = Array.Empty(); - } - else - { - result = new TSource[i]; - Array.Copy(array, result, i); - } - } - finally - { - pool.Return(array, clearArray: !RuntimeHelpersAbstraction.IsWellKnownNoReferenceContainsType()); - - if (e != null) - { - await e.DisposeAsync(); - } - } - - return result; - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/ToArray.cs.meta b/VirtueSky/UniTask/Runtime/Linq/ToArray.cs.meta deleted file mode 100644 index 679d61c9..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/ToArray.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: debb010bbb1622e43b94fe70ec0133dd -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/ToDictionary.cs b/VirtueSky/UniTask/Runtime/Linq/ToDictionary.cs deleted file mode 100644 index 66aa2b43..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/ToDictionary.cs +++ /dev/null @@ -1,278 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask> ToDictionaryAsync(this IUniTaskAsyncEnumerable source, Func keySelector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - - return ToDictionary.ToDictionaryAsync(source, keySelector, EqualityComparer.Default, cancellationToken); - } - - public static UniTask> ToDictionaryAsync(this IUniTaskAsyncEnumerable source, Func keySelector, IEqualityComparer comparer, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return ToDictionary.ToDictionaryAsync(source, keySelector, comparer, cancellationToken); - } - - public static UniTask> ToDictionaryAsync(this IUniTaskAsyncEnumerable source, Func keySelector, Func elementSelector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - - return ToDictionary.ToDictionaryAsync(source, keySelector, elementSelector, EqualityComparer.Default, cancellationToken); - } - - public static UniTask> ToDictionaryAsync(this IUniTaskAsyncEnumerable source, Func keySelector, Func elementSelector, IEqualityComparer comparer, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return ToDictionary.ToDictionaryAsync(source, keySelector, elementSelector, comparer, cancellationToken); - } - - public static UniTask> ToDictionaryAwaitAsync(this IUniTaskAsyncEnumerable source, Func> keySelector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - - return ToDictionary.ToDictionaryAwaitAsync(source, keySelector, EqualityComparer.Default, cancellationToken); - } - - public static UniTask> ToDictionaryAwaitAsync(this IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return ToDictionary.ToDictionaryAwaitAsync(source, keySelector, comparer, cancellationToken); - } - - public static UniTask> ToDictionaryAwaitAsync(this IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - - return ToDictionary.ToDictionaryAwaitAsync(source, keySelector, elementSelector, EqualityComparer.Default, cancellationToken); - } - - public static UniTask> ToDictionaryAwaitAsync(this IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, IEqualityComparer comparer, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return ToDictionary.ToDictionaryAwaitAsync(source, keySelector, elementSelector, comparer, cancellationToken); - } - - public static UniTask> ToDictionaryAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> keySelector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - - return ToDictionary.ToDictionaryAwaitWithCancellationAsync(source, keySelector, EqualityComparer.Default, cancellationToken); - } - - public static UniTask> ToDictionaryAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return ToDictionary.ToDictionaryAwaitWithCancellationAsync(source, keySelector, comparer, cancellationToken); - } - - public static UniTask> ToDictionaryAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - - return ToDictionary.ToDictionaryAwaitWithCancellationAsync(source, keySelector, elementSelector, EqualityComparer.Default, cancellationToken); - } - - public static UniTask> ToDictionaryAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, IEqualityComparer comparer, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return ToDictionary.ToDictionaryAwaitWithCancellationAsync(source, keySelector, elementSelector, comparer, cancellationToken); - } - } - - internal static class ToDictionary - { - internal static async UniTask> ToDictionaryAsync(IUniTaskAsyncEnumerable source, Func keySelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - var dict = new Dictionary(comparer); - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = e.Current; - var key = keySelector(v); - dict.Add(key, v); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return dict; - } - - internal static async UniTask> ToDictionaryAsync(IUniTaskAsyncEnumerable source, Func keySelector, Func elementSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - var dict = new Dictionary(comparer); - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = e.Current; - var key = keySelector(v); - var value = elementSelector(v); - dict.Add(key, value); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return dict; - } - - // with await - - internal static async UniTask> ToDictionaryAwaitAsync(IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - var dict = new Dictionary(comparer); - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = e.Current; - var key = await keySelector(v); - dict.Add(key, v); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return dict; - } - - internal static async UniTask> ToDictionaryAwaitAsync(IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - var dict = new Dictionary(comparer); - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = e.Current; - var key = await keySelector(v); - var value = await elementSelector(v); - dict.Add(key, value); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return dict; - } - - // with cancellation - - internal static async UniTask> ToDictionaryAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - var dict = new Dictionary(comparer); - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = e.Current; - var key = await keySelector(v, cancellationToken); - dict.Add(key, v); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return dict; - } - - internal static async UniTask> ToDictionaryAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - var dict = new Dictionary(comparer); - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - var v = e.Current; - var key = await keySelector(v, cancellationToken); - var value = await elementSelector(v, cancellationToken); - dict.Add(key, value); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return dict; - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/ToDictionary.cs.meta b/VirtueSky/UniTask/Runtime/Linq/ToDictionary.cs.meta deleted file mode 100644 index 4deed194..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/ToDictionary.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 03b109b1fe1f2df46aa56ffb26747654 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/ToHashSet.cs b/VirtueSky/UniTask/Runtime/Linq/ToHashSet.cs deleted file mode 100644 index 351adfca..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/ToHashSet.cs +++ /dev/null @@ -1,50 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask> ToHashSetAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return VirtueSky.Threading.Tasks.Linq.ToHashSet.ToHashSetAsync(source, EqualityComparer.Default, cancellationToken); - } - - public static UniTask> ToHashSetAsync(this IUniTaskAsyncEnumerable source, IEqualityComparer comparer, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return VirtueSky.Threading.Tasks.Linq.ToHashSet.ToHashSetAsync(source, comparer, cancellationToken); - } - } - - internal static class ToHashSet - { - internal static async UniTask> ToHashSetAsync(IUniTaskAsyncEnumerable source, IEqualityComparer comparer, CancellationToken cancellationToken) - { - var set = new HashSet(comparer); - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - set.Add(e.Current); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return set; - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/ToHashSet.cs.meta b/VirtueSky/UniTask/Runtime/Linq/ToHashSet.cs.meta deleted file mode 100644 index 8d3c4af2..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/ToHashSet.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7a3e552113af96e4986805ec3c4fc80a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/ToList.cs b/VirtueSky/UniTask/Runtime/Linq/ToList.cs deleted file mode 100644 index 8eb90235..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/ToList.cs +++ /dev/null @@ -1,42 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask> ToListAsync(this IUniTaskAsyncEnumerable source, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return VirtueSky.Threading.Tasks.Linq.ToList.ToListAsync(source, cancellationToken); - } - } - - internal static class ToList - { - internal static async UniTask> ToListAsync(IUniTaskAsyncEnumerable source, CancellationToken cancellationToken) - { - var list = new List(); - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (await e.MoveNextAsync()) - { - list.Add(e.Current); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - - return list; - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/ToList.cs.meta b/VirtueSky/UniTask/Runtime/Linq/ToList.cs.meta deleted file mode 100644 index 4f093738..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/ToList.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3859c1b31e81d9b44b282e7d97e11635 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/ToLookup.cs b/VirtueSky/UniTask/Runtime/Linq/ToLookup.cs deleted file mode 100644 index 52ca154a..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/ToLookup.cs +++ /dev/null @@ -1,554 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static UniTask> ToLookupAsync(this IUniTaskAsyncEnumerable source, Func keySelector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - - return ToLookup.ToLookupAsync(source, keySelector, EqualityComparer.Default, cancellationToken); - } - - public static UniTask> ToLookupAsync(this IUniTaskAsyncEnumerable source, Func keySelector, IEqualityComparer comparer, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return ToLookup.ToLookupAsync(source, keySelector, comparer, cancellationToken); - } - - public static UniTask> ToLookupAsync(this IUniTaskAsyncEnumerable source, Func keySelector, Func elementSelector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - - return ToLookup.ToLookupAsync(source, keySelector, elementSelector, EqualityComparer.Default, cancellationToken); - } - - public static UniTask> ToLookupAsync(this IUniTaskAsyncEnumerable source, Func keySelector, Func elementSelector, IEqualityComparer comparer, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return ToLookup.ToLookupAsync(source, keySelector, elementSelector, comparer, cancellationToken); - } - - public static UniTask> ToLookupAwaitAsync(this IUniTaskAsyncEnumerable source, Func> keySelector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - - return ToLookup.ToLookupAwaitAsync(source, keySelector, EqualityComparer.Default, cancellationToken); - } - - public static UniTask> ToLookupAwaitAsync(this IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return ToLookup.ToLookupAwaitAsync(source, keySelector, comparer, cancellationToken); - } - - public static UniTask> ToLookupAwaitAsync(this IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - - return ToLookup.ToLookupAwaitAsync(source, keySelector, elementSelector, EqualityComparer.Default, cancellationToken); - } - - public static UniTask> ToLookupAwaitAsync(this IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, IEqualityComparer comparer, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return ToLookup.ToLookupAwaitAsync(source, keySelector, elementSelector, comparer, cancellationToken); - } - - public static UniTask> ToLookupAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> keySelector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - - return ToLookup.ToLookupAwaitWithCancellationAsync(source, keySelector, EqualityComparer.Default, cancellationToken); - } - - public static UniTask> ToLookupAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return ToLookup.ToLookupAwaitWithCancellationAsync(source, keySelector, comparer, cancellationToken); - } - - public static UniTask> ToLookupAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - - return ToLookup.ToLookupAwaitWithCancellationAsync(source, keySelector, elementSelector, EqualityComparer.Default, cancellationToken); - } - - public static UniTask> ToLookupAwaitWithCancellationAsync(this IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, IEqualityComparer comparer, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(keySelector, nameof(keySelector)); - Error.ThrowArgumentNullException(elementSelector, nameof(elementSelector)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - return ToLookup.ToLookupAwaitWithCancellationAsync(source, keySelector, elementSelector, comparer, cancellationToken); - } - } - - internal static class ToLookup - { - internal static async UniTask> ToLookupAsync(IUniTaskAsyncEnumerable source, Func keySelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - var pool = ArrayPool.Shared; - var array = pool.Rent(16); - - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - var i = 0; - while (await e.MoveNextAsync()) - { - ArrayPoolUtil.EnsureCapacity(ref array, i, pool); - array[i++] = e.Current; - } - - if (i == 0) - { - return Lookup.CreateEmpty(); - } - else - { - return Lookup.Create(new ArraySegment(array, 0, i), keySelector, comparer); - } - } - finally - { - pool.Return(array, clearArray: !RuntimeHelpersAbstraction.IsWellKnownNoReferenceContainsType()); - - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - internal static async UniTask> ToLookupAsync(IUniTaskAsyncEnumerable source, Func keySelector, Func elementSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - var pool = ArrayPool.Shared; - var array = pool.Rent(16); - - IUniTaskAsyncEnumerator e = default; - try - { - e = source.GetAsyncEnumerator(cancellationToken); - var i = 0; - while (await e.MoveNextAsync()) - { - ArrayPoolUtil.EnsureCapacity(ref array, i, pool); - array[i++] = e.Current; - } - - if (i == 0) - { - return Lookup.CreateEmpty(); - } - else - { - return Lookup.Create(new ArraySegment(array, 0, i), keySelector, elementSelector, comparer); - } - } - finally - { - pool.Return(array, clearArray: !RuntimeHelpersAbstraction.IsWellKnownNoReferenceContainsType()); - - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - - // with await - - internal static async UniTask> ToLookupAwaitAsync(IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - var pool = ArrayPool.Shared; - var array = pool.Rent(16); - - IUniTaskAsyncEnumerator e = default; - try - { - e = source.GetAsyncEnumerator(cancellationToken); - var i = 0; - while (await e.MoveNextAsync()) - { - ArrayPoolUtil.EnsureCapacity(ref array, i, pool); - array[i++] = e.Current; - } - - if (i == 0) - { - return Lookup.CreateEmpty(); - } - else - { - return await Lookup.CreateAsync(new ArraySegment(array, 0, i), keySelector, comparer); - } - } - finally - { - pool.Return(array, clearArray: !RuntimeHelpersAbstraction.IsWellKnownNoReferenceContainsType()); - - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - internal static async UniTask> ToLookupAwaitAsync(IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - var pool = ArrayPool.Shared; - var array = pool.Rent(16); - - IUniTaskAsyncEnumerator e = default; - try - { - e = source.GetAsyncEnumerator(cancellationToken); - var i = 0; - while (await e.MoveNextAsync()) - { - ArrayPoolUtil.EnsureCapacity(ref array, i, pool); - array[i++] = e.Current; - } - - if (i == 0) - { - return Lookup.CreateEmpty(); - } - else - { - return await Lookup.CreateAsync(new ArraySegment(array, 0, i), keySelector, elementSelector, comparer); - } - } - finally - { - pool.Return(array, clearArray: !RuntimeHelpersAbstraction.IsWellKnownNoReferenceContainsType()); - - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - // with cancellation - - internal static async UniTask> ToLookupAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> keySelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - var pool = ArrayPool.Shared; - var array = pool.Rent(16); - - IUniTaskAsyncEnumerator e = default; - try - { - e = source.GetAsyncEnumerator(cancellationToken); - var i = 0; - while (await e.MoveNextAsync()) - { - ArrayPoolUtil.EnsureCapacity(ref array, i, pool); - array[i++] = e.Current; - } - - if (i == 0) - { - return Lookup.CreateEmpty(); - } - else - { - return await Lookup.CreateAsync(new ArraySegment(array, 0, i), keySelector, comparer, cancellationToken); - } - } - finally - { - pool.Return(array, clearArray: !RuntimeHelpersAbstraction.IsWellKnownNoReferenceContainsType()); - - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - internal static async UniTask> ToLookupAwaitWithCancellationAsync(IUniTaskAsyncEnumerable source, Func> keySelector, Func> elementSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - var pool = ArrayPool.Shared; - var array = pool.Rent(16); - - IUniTaskAsyncEnumerator e = default; - try - { - e = source.GetAsyncEnumerator(cancellationToken); - var i = 0; - while (await e.MoveNextAsync()) - { - ArrayPoolUtil.EnsureCapacity(ref array, i, pool); - array[i++] = e.Current; - } - - if (i == 0) - { - return Lookup.CreateEmpty(); - } - else - { - return await Lookup.CreateAsync(new ArraySegment(array, 0, i), keySelector, elementSelector, comparer, cancellationToken); - } - } - finally - { - pool.Return(array, clearArray: !RuntimeHelpersAbstraction.IsWellKnownNoReferenceContainsType()); - - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - // Lookup - - class Lookup : ILookup - { - static readonly Lookup empty = new Lookup(new Dictionary>()); - - // original lookup keeps order but this impl does not(dictionary not guarantee) - readonly Dictionary> dict; - - Lookup(Dictionary> dict) - { - this.dict = dict; - } - - public static Lookup CreateEmpty() - { - return empty; - } - - public static Lookup Create(ArraySegment source, Func keySelector, IEqualityComparer comparer) - { - var dict = new Dictionary>(comparer); - - var arr = source.Array; - var c = source.Count; - for (int i = source.Offset; i < c; i++) - { - var key = keySelector(arr[i]); - - if (!dict.TryGetValue(key, out var list)) - { - list = new Grouping(key); - dict[key] = list; - } - - list.Add(arr[i]); - } - - return new Lookup(dict); - } - - public static Lookup Create(ArraySegment source, Func keySelector, Func elementSelector, IEqualityComparer comparer) - { - var dict = new Dictionary>(comparer); - - var arr = source.Array; - var c = source.Count; - for (int i = source.Offset; i < c; i++) - { - var key = keySelector(arr[i]); - var elem = elementSelector(arr[i]); - - if (!dict.TryGetValue(key, out var list)) - { - list = new Grouping(key); - dict[key] = list; - } - - list.Add(elem); - } - - return new Lookup(dict); - } - - public static async UniTask> CreateAsync(ArraySegment source, Func> keySelector, IEqualityComparer comparer) - { - var dict = new Dictionary>(comparer); - - var arr = source.Array; - var c = source.Count; - for (int i = source.Offset; i < c; i++) - { - var key = await keySelector(arr[i]); - - if (!dict.TryGetValue(key, out var list)) - { - list = new Grouping(key); - dict[key] = list; - } - - list.Add(arr[i]); - } - - return new Lookup(dict); - } - - public static async UniTask> CreateAsync(ArraySegment source, Func> keySelector, Func> elementSelector, IEqualityComparer comparer) - { - var dict = new Dictionary>(comparer); - - var arr = source.Array; - var c = source.Count; - for (int i = source.Offset; i < c; i++) - { - var key = await keySelector(arr[i]); - var elem = await elementSelector(arr[i]); - - if (!dict.TryGetValue(key, out var list)) - { - list = new Grouping(key); - dict[key] = list; - } - - list.Add(elem); - } - - return new Lookup(dict); - } - - public static async UniTask> CreateAsync(ArraySegment source, Func> keySelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - var dict = new Dictionary>(comparer); - - var arr = source.Array; - var c = source.Count; - for (int i = source.Offset; i < c; i++) - { - var key = await keySelector(arr[i], cancellationToken); - - if (!dict.TryGetValue(key, out var list)) - { - list = new Grouping(key); - dict[key] = list; - } - - list.Add(arr[i]); - } - - return new Lookup(dict); - } - - public static async UniTask> CreateAsync(ArraySegment source, Func> keySelector, Func> elementSelector, IEqualityComparer comparer, CancellationToken cancellationToken) - { - var dict = new Dictionary>(comparer); - - var arr = source.Array; - var c = source.Count; - for (int i = source.Offset; i < c; i++) - { - var key = await keySelector(arr[i], cancellationToken); - var elem = await elementSelector(arr[i], cancellationToken); - - if (!dict.TryGetValue(key, out var list)) - { - list = new Grouping(key); - dict[key] = list; - } - - list.Add(elem); - } - - return new Lookup(dict); - } - - public IEnumerable this[TKey key] => dict.TryGetValue(key, out var g) ? g : Enumerable.Empty(); - - public int Count => dict.Count; - - public bool Contains(TKey key) - { - return dict.ContainsKey(key); - } - - public IEnumerator> GetEnumerator() - { - return dict.Values.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return dict.Values.GetEnumerator(); - } - } - - class Grouping : IGrouping // , IUniTaskAsyncGrouping - { - readonly List elements; - - public TKey Key { get; private set; } - - public Grouping(TKey key) - { - this.Key = key; - this.elements = new List(); - } - - public void Add(TElement value) - { - elements.Add(value); - } - public IEnumerator GetEnumerator() - { - return elements.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return elements.GetEnumerator(); - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return this.ToUniTaskAsyncEnumerable().GetAsyncEnumerator(cancellationToken); - } - - public override string ToString() - { - return "Key: " + Key + ", Count: " + elements.Count; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/ToLookup.cs.meta b/VirtueSky/UniTask/Runtime/Linq/ToLookup.cs.meta deleted file mode 100644 index 7dd8ecd6..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/ToLookup.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 57da22563bcd6ca4aaf256d941de5cb0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/ToObservable.cs b/VirtueSky/UniTask/Runtime/Linq/ToObservable.cs deleted file mode 100644 index 235e74cf..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/ToObservable.cs +++ /dev/null @@ -1,97 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IObservable ToObservable(this IUniTaskAsyncEnumerable source) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return new ToObservable(source); - } - } - - internal sealed class ToObservable : IObservable - { - readonly IUniTaskAsyncEnumerable source; - - public ToObservable(IUniTaskAsyncEnumerable source) - { - this.source = source; - } - - public IDisposable Subscribe(IObserver observer) - { - var ctd = new CancellationTokenDisposable(); - - RunAsync(source, observer, ctd.Token).Forget(); - - return ctd; - } - - static async UniTaskVoid RunAsync(IUniTaskAsyncEnumerable src, IObserver observer, CancellationToken cancellationToken) - { - // cancellationToken.IsCancellationRequested is called when Rx's Disposed. - // when disposed, finish silently. - - var e = src.GetAsyncEnumerator(cancellationToken); - try - { - bool hasNext; - - do - { - try - { - hasNext = await e.MoveNextAsync(); - } - catch (Exception ex) - { - if (cancellationToken.IsCancellationRequested) - { - return; - } - - observer.OnError(ex); - return; - } - - if (hasNext) - { - observer.OnNext(e.Current); - } - else - { - observer.OnCompleted(); - return; - } - } while (!cancellationToken.IsCancellationRequested); - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - internal sealed class CancellationTokenDisposable : IDisposable - { - readonly CancellationTokenSource cts = new CancellationTokenSource(); - - public CancellationToken Token => cts.Token; - - public void Dispose() - { - if (!cts.IsCancellationRequested) - { - cts.Cancel(); - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/ToObservable.cs.meta b/VirtueSky/UniTask/Runtime/Linq/ToObservable.cs.meta deleted file mode 100644 index 44d917e3..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/ToObservable.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b4f6f48a532188e4c80b7ebe69aea3a8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/ToUniTaskAsyncEnumerable.cs b/VirtueSky/UniTask/Runtime/Linq/ToUniTaskAsyncEnumerable.cs deleted file mode 100644 index 47e46244..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/ToUniTaskAsyncEnumerable.cs +++ /dev/null @@ -1,1115 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Runtime.ExceptionServices; -using System.Threading; -using System.Threading.Tasks; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable ToUniTaskAsyncEnumerable(this IEnumerable source) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return new ToUniTaskAsyncEnumerable(source); - } - - public static IUniTaskAsyncEnumerable ToUniTaskAsyncEnumerable(this Task source) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return new ToUniTaskAsyncEnumerableTask(source); - } - - public static IUniTaskAsyncEnumerable ToUniTaskAsyncEnumerable(this UniTask source) - { - return new ToUniTaskAsyncEnumerableUniTask(source); - } - - public static IUniTaskAsyncEnumerable ToUniTaskAsyncEnumerable(this IObservable source) - { - Error.ThrowArgumentNullException(source, nameof(source)); - - return new ToUniTaskAsyncEnumerableObservable(source); - } - } - - internal class ToUniTaskAsyncEnumerable : IUniTaskAsyncEnumerable - { - readonly IEnumerable source; - - public ToUniTaskAsyncEnumerable(IEnumerable source) - { - this.source = source; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _ToUniTaskAsyncEnumerable(source, cancellationToken); - } - - class _ToUniTaskAsyncEnumerable : IUniTaskAsyncEnumerator - { - readonly IEnumerable source; - CancellationToken cancellationToken; - - IEnumerator enumerator; - - public _ToUniTaskAsyncEnumerable(IEnumerable source, CancellationToken cancellationToken) - { - this.source = source; - this.cancellationToken = cancellationToken; - } - - public T Current => enumerator.Current; - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - - if (enumerator == null) - { - enumerator = source.GetEnumerator(); - } - - if (enumerator.MoveNext()) - { - return CompletedTasks.True; - } - - return CompletedTasks.False; - } - - public UniTask DisposeAsync() - { - enumerator.Dispose(); - return default; - } - } - } - - internal class ToUniTaskAsyncEnumerableTask : IUniTaskAsyncEnumerable - { - readonly Task source; - - public ToUniTaskAsyncEnumerableTask(Task source) - { - this.source = source; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _ToUniTaskAsyncEnumerableTask(source, cancellationToken); - } - - class _ToUniTaskAsyncEnumerableTask : IUniTaskAsyncEnumerator - { - readonly Task source; - CancellationToken cancellationToken; - - T current; - bool called; - - public _ToUniTaskAsyncEnumerableTask(Task source, CancellationToken cancellationToken) - { - this.source = source; - this.cancellationToken = cancellationToken; - - this.called = false; - } - - public T Current => current; - - public async UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - - if (called) - { - return false; - } - called = true; - - current = await source; - return true; - } - - public UniTask DisposeAsync() - { - return default; - } - } - } - - internal class ToUniTaskAsyncEnumerableUniTask : IUniTaskAsyncEnumerable - { - readonly UniTask source; - - public ToUniTaskAsyncEnumerableUniTask(UniTask source) - { - this.source = source; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _ToUniTaskAsyncEnumerableUniTask(source, cancellationToken); - } - - class _ToUniTaskAsyncEnumerableUniTask : IUniTaskAsyncEnumerator - { - readonly UniTask source; - CancellationToken cancellationToken; - - T current; - bool called; - - public _ToUniTaskAsyncEnumerableUniTask(UniTask source, CancellationToken cancellationToken) - { - this.source = source; - this.cancellationToken = cancellationToken; - - this.called = false; - } - - public T Current => current; - - public async UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - - if (called) - { - return false; - } - called = true; - - current = await source; - return true; - } - - public UniTask DisposeAsync() - { - return default; - } - } - } - - internal class ToUniTaskAsyncEnumerableObservable : IUniTaskAsyncEnumerable - { - readonly IObservable source; - - public ToUniTaskAsyncEnumerableObservable(IObservable source) - { - this.source = source; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _ToUniTaskAsyncEnumerableObservable(source, cancellationToken); - } - - class _ToUniTaskAsyncEnumerableObservable : MoveNextSource, IUniTaskAsyncEnumerator, IObserver - { - static readonly Action OnCanceledDelegate = OnCanceled; - - readonly IObservable source; - CancellationToken cancellationToken; - - - bool useCachedCurrent; - T current; - bool subscribeCompleted; - readonly Queue queuedResult; - Exception error; - IDisposable subscription; - CancellationTokenRegistration cancellationTokenRegistration; - - public _ToUniTaskAsyncEnumerableObservable(IObservable source, CancellationToken cancellationToken) - { - this.source = source; - this.cancellationToken = cancellationToken; - this.queuedResult = new Queue(); - - if (cancellationToken.CanBeCanceled) - { - cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(OnCanceledDelegate, this); - } - } - - public T Current - { - get - { - if (useCachedCurrent) - { - return current; - } - - lock (queuedResult) - { - if (queuedResult.Count != 0) - { - current = queuedResult.Dequeue(); - useCachedCurrent = true; - return current; - } - else - { - return default; // undefined. - } - } - } - } - - public UniTask MoveNextAsync() - { - lock (queuedResult) - { - useCachedCurrent = false; - - if (cancellationToken.IsCancellationRequested) - { - return UniTask.FromCanceled(cancellationToken); - } - - if (subscription == null) - { - subscription = source.Subscribe(this); - } - - if (error != null) - { - return UniTask.FromException(error); - } - - if (queuedResult.Count != 0) - { - return CompletedTasks.True; - } - - if (subscribeCompleted) - { - return CompletedTasks.False; - } - - completionSource.Reset(); - return new UniTask(this, completionSource.Version); - } - } - - public UniTask DisposeAsync() - { - subscription.Dispose(); - cancellationTokenRegistration.Dispose(); - completionSource.Reset(); - return default; - } - - public void OnCompleted() - { - lock (queuedResult) - { - subscribeCompleted = true; - completionSource.TrySetResult(false); - } - } - - public void OnError(Exception error) - { - lock (queuedResult) - { - this.error = error; - completionSource.TrySetException(error); - } - } - - public void OnNext(T value) - { - lock (queuedResult) - { - queuedResult.Enqueue(value); - completionSource.TrySetResult(true); // include callback execution, too long lock? - } - } - - static void OnCanceled(object state) - { - var self = (_ToUniTaskAsyncEnumerableObservable)state; - lock (self.queuedResult) - { - self.completionSource.TrySetCanceled(self.cancellationToken); - } - } - } - } -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/VirtueSky/UniTask/Runtime/Linq/ToUniTaskAsyncEnumerable.cs.meta b/VirtueSky/UniTask/Runtime/Linq/ToUniTaskAsyncEnumerable.cs.meta deleted file mode 100644 index 45fd3b08..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/ToUniTaskAsyncEnumerable.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d7192de2a0581ec4db62962cc1404af5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Union.cs b/VirtueSky/UniTask/Runtime/Linq/Union.cs deleted file mode 100644 index 877782e7..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Union.cs +++ /dev/null @@ -1,26 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System.Collections.Generic; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Union(this IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second) - { - Error.ThrowArgumentNullException(first, nameof(first)); - Error.ThrowArgumentNullException(second, nameof(second)); - - return Union(first, second, EqualityComparer.Default); - } - - public static IUniTaskAsyncEnumerable Union(this IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, IEqualityComparer comparer) - { - Error.ThrowArgumentNullException(first, nameof(first)); - Error.ThrowArgumentNullException(second, nameof(second)); - Error.ThrowArgumentNullException(comparer, nameof(comparer)); - - // improv without combinate? - return first.Concat(second).Distinct(comparer); - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Union.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Union.cs.meta deleted file mode 100644 index 1d9c7adb..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Union.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ae57a55bdeba98b4f8ff234d98d7dd76 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/UnityExtensions.meta b/VirtueSky/UniTask/Runtime/Linq/UnityExtensions.meta deleted file mode 100644 index 315d0de1..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/UnityExtensions.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 750ca73b7c4161242b325102bbec2bc7 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/UnityExtensions/EveryUpdate.cs b/VirtueSky/UniTask/Runtime/Linq/UnityExtensions/EveryUpdate.cs deleted file mode 100644 index cca606b3..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/UnityExtensions/EveryUpdate.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable EveryUpdate(PlayerLoopTiming updateTiming = PlayerLoopTiming.Update, bool cancelImmediately = false) - { - return new EveryUpdate(updateTiming, cancelImmediately); - } - } - - internal class EveryUpdate : IUniTaskAsyncEnumerable - { - readonly PlayerLoopTiming updateTiming; - readonly bool cancelImmediately; - - public EveryUpdate(PlayerLoopTiming updateTiming, bool cancelImmediately) - { - this.updateTiming = updateTiming; - this.cancelImmediately = cancelImmediately; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _EveryUpdate(updateTiming, cancellationToken, cancelImmediately); - } - - class _EveryUpdate : MoveNextSource, IUniTaskAsyncEnumerator, IPlayerLoopItem - { - readonly PlayerLoopTiming updateTiming; - readonly CancellationToken cancellationToken; - readonly CancellationTokenRegistration cancellationTokenRegistration; - - bool disposed; - - public _EveryUpdate(PlayerLoopTiming updateTiming, CancellationToken cancellationToken, bool cancelImmediately) - { - this.updateTiming = updateTiming; - this.cancellationToken = cancellationToken; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var source = (_EveryUpdate)state; - source.completionSource.TrySetCanceled(source.cancellationToken); - }, this); - } - - TaskTracker.TrackActiveTask(this, 2); - PlayerLoopHelper.AddAction(updateTiming, this); - } - - public AsyncUnit Current => default; - - public UniTask MoveNextAsync() - { - if (disposed) return CompletedTasks.False; - - completionSource.Reset(); - - if (cancellationToken.IsCancellationRequested) - { - completionSource.TrySetCanceled(cancellationToken); - } - return new UniTask(this, completionSource.Version); - } - - public UniTask DisposeAsync() - { - if (!disposed) - { - cancellationTokenRegistration.Dispose(); - disposed = true; - TaskTracker.RemoveTracking(this); - } - return default; - } - - public bool MoveNext() - { - if (cancellationToken.IsCancellationRequested) - { - completionSource.TrySetCanceled(cancellationToken); - return false; - } - - if (disposed) - { - completionSource.TrySetResult(false); - return false; - } - - completionSource.TrySetResult(true); - return true; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/UnityExtensions/EveryUpdate.cs.meta b/VirtueSky/UniTask/Runtime/Linq/UnityExtensions/EveryUpdate.cs.meta deleted file mode 100644 index 6336e0e3..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/UnityExtensions/EveryUpdate.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 00520eb52e49b5b4e8d9870d6ff1aced -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/UnityExtensions/EveryValueChanged.cs b/VirtueSky/UniTask/Runtime/Linq/UnityExtensions/EveryValueChanged.cs deleted file mode 100644 index 42d66966..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/UnityExtensions/EveryValueChanged.cs +++ /dev/null @@ -1,292 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections.Generic; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable EveryValueChanged(TTarget target, Func propertySelector, PlayerLoopTiming monitorTiming = PlayerLoopTiming.Update, IEqualityComparer equalityComparer = null, bool cancelImmediately = false) - where TTarget : class - { - var unityObject = target as UnityEngine.Object; - var isUnityObject = target is UnityEngine.Object; // don't use (unityObject == null) - - if (isUnityObject) - { - return new EveryValueChangedUnityObject(target, propertySelector, equalityComparer ?? UnityEqualityComparer.GetDefault(), monitorTiming, cancelImmediately); - } - else - { - return new EveryValueChangedStandardObject(target, propertySelector, equalityComparer ?? UnityEqualityComparer.GetDefault(), monitorTiming, cancelImmediately); - } - } - } - - internal sealed class EveryValueChangedUnityObject : IUniTaskAsyncEnumerable - { - readonly TTarget target; - readonly Func propertySelector; - readonly IEqualityComparer equalityComparer; - readonly PlayerLoopTiming monitorTiming; - readonly bool cancelImmediately; - - public EveryValueChangedUnityObject(TTarget target, Func propertySelector, IEqualityComparer equalityComparer, PlayerLoopTiming monitorTiming, bool cancelImmediately) - { - this.target = target; - this.propertySelector = propertySelector; - this.equalityComparer = equalityComparer; - this.monitorTiming = monitorTiming; - this.cancelImmediately = cancelImmediately; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _EveryValueChanged(target, propertySelector, equalityComparer, monitorTiming, cancellationToken, cancelImmediately); - } - - sealed class _EveryValueChanged : MoveNextSource, IUniTaskAsyncEnumerator, IPlayerLoopItem - { - readonly TTarget target; - readonly UnityEngine.Object targetAsUnityObject; - readonly IEqualityComparer equalityComparer; - readonly Func propertySelector; - readonly CancellationToken cancellationToken; - readonly CancellationTokenRegistration cancellationTokenRegistration; - - bool first; - TProperty currentValue; - bool disposed; - - public _EveryValueChanged(TTarget target, Func propertySelector, IEqualityComparer equalityComparer, PlayerLoopTiming monitorTiming, CancellationToken cancellationToken, bool cancelImmediately) - { - this.target = target; - this.targetAsUnityObject = target as UnityEngine.Object; - this.propertySelector = propertySelector; - this.equalityComparer = equalityComparer; - this.cancellationToken = cancellationToken; - this.first = true; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var source = (_EveryValueChanged)state; - source.completionSource.TrySetCanceled(source.cancellationToken); - }, this); - } - - TaskTracker.TrackActiveTask(this, 2); - PlayerLoopHelper.AddAction(monitorTiming, this); - } - - public TProperty Current => currentValue; - - public UniTask MoveNextAsync() - { - if (disposed) return CompletedTasks.False; - - completionSource.Reset(); - - if (cancellationToken.IsCancellationRequested) - { - completionSource.TrySetCanceled(cancellationToken); - return new UniTask(this, completionSource.Version); - } - - if (first) - { - first = false; - if (targetAsUnityObject == null) - { - return CompletedTasks.False; - } - this.currentValue = propertySelector(target); - return CompletedTasks.True; - } - - return new UniTask(this, completionSource.Version); - } - - public UniTask DisposeAsync() - { - if (!disposed) - { - cancellationTokenRegistration.Dispose(); - disposed = true; - TaskTracker.RemoveTracking(this); - } - return default; - } - - public bool MoveNext() - { - if (disposed || targetAsUnityObject == null) - { - completionSource.TrySetResult(false); - DisposeAsync().Forget(); - return false; - } - - if (cancellationToken.IsCancellationRequested) - { - completionSource.TrySetCanceled(cancellationToken); - return false; - } - TProperty nextValue = default(TProperty); - try - { - nextValue = propertySelector(target); - if (equalityComparer.Equals(currentValue, nextValue)) - { - return true; - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - DisposeAsync().Forget(); - return false; - } - - currentValue = nextValue; - completionSource.TrySetResult(true); - return true; - } - } - } - - internal sealed class EveryValueChangedStandardObject : IUniTaskAsyncEnumerable - where TTarget : class - { - readonly WeakReference target; - readonly Func propertySelector; - readonly IEqualityComparer equalityComparer; - readonly PlayerLoopTiming monitorTiming; - readonly bool cancelImmediately; - - public EveryValueChangedStandardObject(TTarget target, Func propertySelector, IEqualityComparer equalityComparer, PlayerLoopTiming monitorTiming, bool cancelImmediately) - { - this.target = new WeakReference(target, false); - this.propertySelector = propertySelector; - this.equalityComparer = equalityComparer; - this.monitorTiming = monitorTiming; - this.cancelImmediately = cancelImmediately; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _EveryValueChanged(target, propertySelector, equalityComparer, monitorTiming, cancellationToken, cancelImmediately); - } - - sealed class _EveryValueChanged : MoveNextSource, IUniTaskAsyncEnumerator, IPlayerLoopItem - { - readonly WeakReference target; - readonly IEqualityComparer equalityComparer; - readonly Func propertySelector; - readonly CancellationToken cancellationToken; - readonly CancellationTokenRegistration cancellationTokenRegistration; - - bool first; - TProperty currentValue; - bool disposed; - - public _EveryValueChanged(WeakReference target, Func propertySelector, IEqualityComparer equalityComparer, PlayerLoopTiming monitorTiming, CancellationToken cancellationToken, bool cancelImmediately) - { - this.target = target; - this.propertySelector = propertySelector; - this.equalityComparer = equalityComparer; - this.cancellationToken = cancellationToken; - this.first = true; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var source = (_EveryValueChanged)state; - source.completionSource.TrySetCanceled(source.cancellationToken); - }, this); - } - - TaskTracker.TrackActiveTask(this, 2); - PlayerLoopHelper.AddAction(monitorTiming, this); - } - - public TProperty Current => currentValue; - - public UniTask MoveNextAsync() - { - if (disposed) return CompletedTasks.False; - - completionSource.Reset(); - - if (cancellationToken.IsCancellationRequested) - { - completionSource.TrySetCanceled(cancellationToken); - return new UniTask(this, completionSource.Version); - } - - if (first) - { - first = false; - if (!target.TryGetTarget(out var t)) - { - return CompletedTasks.False; - } - this.currentValue = propertySelector(t); - return CompletedTasks.True; - } - - return new UniTask(this, completionSource.Version); - } - - public UniTask DisposeAsync() - { - if (!disposed) - { - cancellationTokenRegistration.Dispose(); - disposed = true; - TaskTracker.RemoveTracking(this); - } - return default; - } - - public bool MoveNext() - { - if (disposed || !target.TryGetTarget(out var t)) - { - completionSource.TrySetResult(false); - DisposeAsync().Forget(); - return false; - } - - if (cancellationToken.IsCancellationRequested) - { - completionSource.TrySetCanceled(cancellationToken); - return false; - } - - TProperty nextValue = default(TProperty); - try - { - nextValue = propertySelector(t); - if (equalityComparer.Equals(currentValue, nextValue)) - { - return true; - } - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - DisposeAsync().Forget(); - return false; - } - - currentValue = nextValue; - completionSource.TrySetResult(true); - return true; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/UnityExtensions/EveryValueChanged.cs.meta b/VirtueSky/UniTask/Runtime/Linq/UnityExtensions/EveryValueChanged.cs.meta deleted file mode 100644 index 9d2be702..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/UnityExtensions/EveryValueChanged.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1ec39f1c41c305344854782c935ad354 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/UnityExtensions/Timer.cs b/VirtueSky/UniTask/Runtime/Linq/UnityExtensions/Timer.cs deleted file mode 100644 index 0b7d4718..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/UnityExtensions/Timer.cs +++ /dev/null @@ -1,355 +0,0 @@ -using System; -using System.Threading; -using UnityEngine; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Timer(TimeSpan dueTime, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update, bool ignoreTimeScale = false, bool cancelImmediately = false) - { - return new Timer(dueTime, null, updateTiming, ignoreTimeScale, cancelImmediately); - } - - public static IUniTaskAsyncEnumerable Timer(TimeSpan dueTime, TimeSpan period, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update, bool ignoreTimeScale = false, bool cancelImmediately = false) - { - return new Timer(dueTime, period, updateTiming, ignoreTimeScale, cancelImmediately); - } - - public static IUniTaskAsyncEnumerable Interval(TimeSpan period, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update, bool ignoreTimeScale = false, bool cancelImmediately = false) - { - return new Timer(period, period, updateTiming, ignoreTimeScale, cancelImmediately); - } - - public static IUniTaskAsyncEnumerable TimerFrame(int dueTimeFrameCount, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update, bool cancelImmediately = false) - { - if (dueTimeFrameCount < 0) - { - throw new ArgumentOutOfRangeException("Delay does not allow minus delayFrameCount. dueTimeFrameCount:" + dueTimeFrameCount); - } - - return new TimerFrame(dueTimeFrameCount, null, updateTiming, cancelImmediately); - } - - public static IUniTaskAsyncEnumerable TimerFrame(int dueTimeFrameCount, int periodFrameCount, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update, bool cancelImmediately = false) - { - if (dueTimeFrameCount < 0) - { - throw new ArgumentOutOfRangeException("Delay does not allow minus delayFrameCount. dueTimeFrameCount:" + dueTimeFrameCount); - } - if (periodFrameCount < 0) - { - throw new ArgumentOutOfRangeException("Delay does not allow minus periodFrameCount. periodFrameCount:" + dueTimeFrameCount); - } - - return new TimerFrame(dueTimeFrameCount, periodFrameCount, updateTiming, cancelImmediately); - } - - public static IUniTaskAsyncEnumerable IntervalFrame(int intervalFrameCount, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update, bool cancelImmediately = false) - { - if (intervalFrameCount < 0) - { - throw new ArgumentOutOfRangeException("Delay does not allow minus intervalFrameCount. intervalFrameCount:" + intervalFrameCount); - } - return new TimerFrame(intervalFrameCount, intervalFrameCount, updateTiming, cancelImmediately); - } - } - - internal class Timer : IUniTaskAsyncEnumerable - { - readonly PlayerLoopTiming updateTiming; - readonly TimeSpan dueTime; - readonly TimeSpan? period; - readonly bool ignoreTimeScale; - readonly bool cancelImmediately; - - public Timer(TimeSpan dueTime, TimeSpan? period, PlayerLoopTiming updateTiming, bool ignoreTimeScale, bool cancelImmediately) - { - this.updateTiming = updateTiming; - this.dueTime = dueTime; - this.period = period; - this.ignoreTimeScale = ignoreTimeScale; - this.cancelImmediately = cancelImmediately; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Timer(dueTime, period, updateTiming, ignoreTimeScale, cancellationToken, cancelImmediately); - } - - class _Timer : MoveNextSource, IUniTaskAsyncEnumerator, IPlayerLoopItem - { - readonly float dueTime; - readonly float? period; - readonly PlayerLoopTiming updateTiming; - readonly bool ignoreTimeScale; - readonly CancellationToken cancellationToken; - readonly CancellationTokenRegistration cancellationTokenRegistration; - - int initialFrame; - float elapsed; - bool dueTimePhase; - bool completed; - bool disposed; - - public _Timer(TimeSpan dueTime, TimeSpan? period, PlayerLoopTiming updateTiming, bool ignoreTimeScale, CancellationToken cancellationToken, bool cancelImmediately) - { - this.dueTime = (float)dueTime.TotalSeconds; - this.period = (period == null) ? null : (float?)period.Value.TotalSeconds; - - if (this.dueTime <= 0) this.dueTime = 0; - if (this.period != null) - { - if (this.period <= 0) this.period = 1; - } - - this.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1; - this.dueTimePhase = true; - this.updateTiming = updateTiming; - this.ignoreTimeScale = ignoreTimeScale; - this.cancellationToken = cancellationToken; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var source = (_Timer)state; - source.completionSource.TrySetCanceled(source.cancellationToken); - }, this); - } - - TaskTracker.TrackActiveTask(this, 2); - PlayerLoopHelper.AddAction(updateTiming, this); - } - - public AsyncUnit Current => default; - - public UniTask MoveNextAsync() - { - // return false instead of throw - if (disposed || completed) return CompletedTasks.False; - - // reset value here. - this.elapsed = 0; - - completionSource.Reset(); - if (cancellationToken.IsCancellationRequested) - { - completionSource.TrySetCanceled(cancellationToken); - } - return new UniTask(this, completionSource.Version); - } - - public UniTask DisposeAsync() - { - if (!disposed) - { - cancellationTokenRegistration.Dispose(); - disposed = true; - TaskTracker.RemoveTracking(this); - } - return default; - } - - public bool MoveNext() - { - if (disposed) - { - completionSource.TrySetResult(false); - return false; - } - if (cancellationToken.IsCancellationRequested) - { - completionSource.TrySetCanceled(cancellationToken); - return false; - } - - if (dueTimePhase) - { - if (elapsed == 0) - { - // skip in initial frame. - if (initialFrame == Time.frameCount) - { - return true; - } - } - - elapsed += (ignoreTimeScale) ? UnityEngine.Time.unscaledDeltaTime : UnityEngine.Time.deltaTime; - - if (elapsed >= dueTime) - { - dueTimePhase = false; - completionSource.TrySetResult(true); - } - } - else - { - if (period == null) - { - completed = true; - completionSource.TrySetResult(false); - return false; - } - - elapsed += (ignoreTimeScale) ? UnityEngine.Time.unscaledDeltaTime : UnityEngine.Time.deltaTime; - - if (elapsed >= period) - { - completionSource.TrySetResult(true); - } - } - - return true; - } - } - } - - internal class TimerFrame : IUniTaskAsyncEnumerable - { - readonly PlayerLoopTiming updateTiming; - readonly int dueTimeFrameCount; - readonly int? periodFrameCount; - readonly bool cancelImmediately; - - public TimerFrame(int dueTimeFrameCount, int? periodFrameCount, PlayerLoopTiming updateTiming, bool cancelImmediately) - { - this.updateTiming = updateTiming; - this.dueTimeFrameCount = dueTimeFrameCount; - this.periodFrameCount = periodFrameCount; - this.cancelImmediately = cancelImmediately; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _TimerFrame(dueTimeFrameCount, periodFrameCount, updateTiming, cancellationToken, cancelImmediately); - } - - class _TimerFrame : MoveNextSource, IUniTaskAsyncEnumerator, IPlayerLoopItem - { - readonly int dueTimeFrameCount; - readonly int? periodFrameCount; - readonly CancellationToken cancellationToken; - readonly CancellationTokenRegistration cancellationTokenRegistration; - - int initialFrame; - int currentFrame; - bool dueTimePhase; - bool completed; - bool disposed; - - public _TimerFrame(int dueTimeFrameCount, int? periodFrameCount, PlayerLoopTiming updateTiming, CancellationToken cancellationToken, bool cancelImmediately) - { - if (dueTimeFrameCount <= 0) dueTimeFrameCount = 0; - if (periodFrameCount != null) - { - if (periodFrameCount <= 0) periodFrameCount = 1; - } - - this.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1; - this.dueTimePhase = true; - this.dueTimeFrameCount = dueTimeFrameCount; - this.periodFrameCount = periodFrameCount; - this.cancellationToken = cancellationToken; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var source = (_TimerFrame)state; - source.completionSource.TrySetCanceled(source.cancellationToken); - }, this); - } - - TaskTracker.TrackActiveTask(this, 2); - PlayerLoopHelper.AddAction(updateTiming, this); - } - - public AsyncUnit Current => default; - - public UniTask MoveNextAsync() - { - if (disposed || completed) return CompletedTasks.False; - - if (cancellationToken.IsCancellationRequested) - { - completionSource.TrySetCanceled(cancellationToken); - } - - // reset value here. - this.currentFrame = 0; - completionSource.Reset(); - return new UniTask(this, completionSource.Version); - } - - public UniTask DisposeAsync() - { - if (!disposed) - { - cancellationTokenRegistration.Dispose(); - disposed = true; - TaskTracker.RemoveTracking(this); - } - return default; - } - - public bool MoveNext() - { - if (cancellationToken.IsCancellationRequested) - { - completionSource.TrySetCanceled(cancellationToken); - return false; - } - if (disposed) - { - completionSource.TrySetResult(false); - return false; - } - - if (dueTimePhase) - { - if (currentFrame == 0) - { - if (dueTimeFrameCount == 0) - { - dueTimePhase = false; - completionSource.TrySetResult(true); - return true; - } - - // skip in initial frame. - if (initialFrame == Time.frameCount) - { - return true; - } - } - - if (++currentFrame >= dueTimeFrameCount) - { - dueTimePhase = false; - completionSource.TrySetResult(true); - } - else - { - } - } - else - { - if (periodFrameCount == null) - { - completed = true; - completionSource.TrySetResult(false); - return false; - } - - if (++currentFrame >= periodFrameCount) - { - completionSource.TrySetResult(true); - } - } - - return true; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/UnityExtensions/Timer.cs.meta b/VirtueSky/UniTask/Runtime/Linq/UnityExtensions/Timer.cs.meta deleted file mode 100644 index aa790c52..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/UnityExtensions/Timer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 382caacde439855418709c641e4d7b04 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Where.cs b/VirtueSky/UniTask/Runtime/Linq/Where.cs deleted file mode 100644 index 9c954ab9..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Where.cs +++ /dev/null @@ -1,818 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - public static IUniTaskAsyncEnumerable Where(this IUniTaskAsyncEnumerable source, Func predicate) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return new Where(source, predicate); - } - - public static IUniTaskAsyncEnumerable Where(this IUniTaskAsyncEnumerable source, Func predicate) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return new WhereInt(source, predicate); - } - - public static IUniTaskAsyncEnumerable WhereAwait(this IUniTaskAsyncEnumerable source, Func> predicate) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return new WhereAwait(source, predicate); - } - - public static IUniTaskAsyncEnumerable WhereAwait(this IUniTaskAsyncEnumerable source, Func> predicate) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return new WhereIntAwait(source, predicate); - } - - public static IUniTaskAsyncEnumerable WhereAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> predicate) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return new WhereAwaitWithCancellation(source, predicate); - } - - public static IUniTaskAsyncEnumerable WhereAwaitWithCancellation(this IUniTaskAsyncEnumerable source, Func> predicate) - { - Error.ThrowArgumentNullException(source, nameof(source)); - Error.ThrowArgumentNullException(predicate, nameof(predicate)); - - return new WhereIntAwaitWithCancellation(source, predicate); - } - } - - internal sealed class Where : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func predicate; - - public Where(IUniTaskAsyncEnumerable source, Func predicate) - { - this.source = source; - this.predicate = predicate; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Where(source, predicate, cancellationToken); - } - - sealed class _Where : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - readonly Func predicate; - readonly CancellationToken cancellationToken; - - int state = -1; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - Action moveNextAction; - - public _Where(IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken) - { - this.source = source; - this.predicate = predicate; - this.cancellationToken = cancellationToken; - this.moveNextAction = MoveNext; - TaskTracker.TrackActiveTask(this, 3); - } - - public TSource Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (state == -2) return default; - - completionSource.Reset(); - MoveNext(); - return new UniTask(this, completionSource.Version); - } - - void MoveNext() - { - REPEAT: - try - { - switch (state) - { - case -1: // init - enumerator = source.GetAsyncEnumerator(cancellationToken); - goto case 0; - case 0: - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case 1; - } - else - { - state = 1; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case 1: - if (awaiter.GetResult()) - { - Current = enumerator.Current; - if (predicate(Current)) - { - goto CONTINUE; - } - else - { - state = 0; - goto REPEAT; - } - } - else - { - goto DONE; - } - default: - goto DONE; - } - } - catch (Exception ex) - { - state = -2; - completionSource.TrySetException(ex); - return; - } - - DONE: - state = -2; - completionSource.TrySetResult(false); - return; - - CONTINUE: - state = 0; - completionSource.TrySetResult(true); - return; - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - return enumerator.DisposeAsync(); - } - } - } - - internal sealed class WhereInt : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func predicate; - - public WhereInt(IUniTaskAsyncEnumerable source, Func predicate) - { - this.source = source; - this.predicate = predicate; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Where(source, predicate, cancellationToken); - } - - sealed class _Where : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - readonly Func predicate; - readonly CancellationToken cancellationToken; - - int state = -1; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - Action moveNextAction; - int index; - - public _Where(IUniTaskAsyncEnumerable source, Func predicate, CancellationToken cancellationToken) - { - this.source = source; - this.predicate = predicate; - this.cancellationToken = cancellationToken; - this.moveNextAction = MoveNext; - TaskTracker.TrackActiveTask(this, 3); - } - - public TSource Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (state == -2) return default; - - completionSource.Reset(); - MoveNext(); - return new UniTask(this, completionSource.Version); - } - - void MoveNext() - { - REPEAT: - try - { - switch (state) - { - case -1: // init - enumerator = source.GetAsyncEnumerator(cancellationToken); - goto case 0; - case 0: - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case 1; - } - else - { - state = 1; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case 1: - if (awaiter.GetResult()) - { - Current = enumerator.Current; - if (predicate(Current, checked(index++))) - { - goto CONTINUE; - } - else - { - state = 0; - goto REPEAT; - } - } - else - { - goto DONE; - } - default: - goto DONE; - } - } - catch (Exception ex) - { - state = -2; - completionSource.TrySetException(ex); - return; - } - - DONE: - state = -2; - completionSource.TrySetResult(false); - return; - - CONTINUE: - state = 0; - completionSource.TrySetResult(true); - return; - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - return enumerator.DisposeAsync(); - } - } - } - - internal sealed class WhereAwait : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> predicate; - - public WhereAwait(IUniTaskAsyncEnumerable source, Func> predicate) - { - this.source = source; - this.predicate = predicate; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _WhereAwait(source, predicate, cancellationToken); - } - - sealed class _WhereAwait : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> predicate; - readonly CancellationToken cancellationToken; - - int state = -1; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - UniTask.Awaiter awaiter2; - Action moveNextAction; - - public _WhereAwait(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - { - this.source = source; - this.predicate = predicate; - this.cancellationToken = cancellationToken; - this.moveNextAction = MoveNext; - TaskTracker.TrackActiveTask(this, 3); - } - - public TSource Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (state == -2) return default; - - completionSource.Reset(); - MoveNext(); - return new UniTask(this, completionSource.Version); - } - - void MoveNext() - { - REPEAT: - try - { - switch (state) - { - case -1: // init - enumerator = source.GetAsyncEnumerator(cancellationToken); - goto case 0; - case 0: - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case 1; - } - else - { - state = 1; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case 1: - if (awaiter.GetResult()) - { - Current = enumerator.Current; - - awaiter2 = predicate(Current).GetAwaiter(); - if (awaiter2.IsCompleted) - { - goto case 2; - } - else - { - state = 2; - awaiter2.UnsafeOnCompleted(moveNextAction); - return; - } - } - else - { - goto DONE; - } - case 2: - if (awaiter2.GetResult()) - { - goto CONTINUE; - } - else - { - state = 0; - goto REPEAT; - } - default: - goto DONE; - } - } - catch (Exception ex) - { - state = -2; - completionSource.TrySetException(ex); - return; - } - - DONE: - state = -2; - completionSource.TrySetResult(false); - return; - - CONTINUE: - state = 0; - completionSource.TrySetResult(true); - return; - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - return enumerator.DisposeAsync(); - } - } - } - - internal sealed class WhereIntAwait : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> predicate; - - public WhereIntAwait(IUniTaskAsyncEnumerable source, Func> predicate) - { - this.source = source; - this.predicate = predicate; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _WhereAwait(source, predicate, cancellationToken); - } - - sealed class _WhereAwait : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> predicate; - readonly CancellationToken cancellationToken; - - int state = -1; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - UniTask.Awaiter awaiter2; - Action moveNextAction; - int index; - - public _WhereAwait(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - { - this.source = source; - this.predicate = predicate; - this.cancellationToken = cancellationToken; - this.moveNextAction = MoveNext; - TaskTracker.TrackActiveTask(this, 3); - } - - public TSource Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (state == -2) return default; - - completionSource.Reset(); - MoveNext(); - return new UniTask(this, completionSource.Version); - } - - void MoveNext() - { - REPEAT: - try - { - switch (state) - { - case -1: // init - enumerator = source.GetAsyncEnumerator(cancellationToken); - goto case 0; - case 0: - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case 1; - } - else - { - state = 1; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case 1: - if (awaiter.GetResult()) - { - Current = enumerator.Current; - - awaiter2 = predicate(Current, checked(index++)).GetAwaiter(); - if (awaiter2.IsCompleted) - { - goto case 2; - } - else - { - state = 2; - awaiter2.UnsafeOnCompleted(moveNextAction); - return; - } - } - else - { - goto DONE; - } - case 2: - if (awaiter2.GetResult()) - { - goto CONTINUE; - } - else - { - state = 0; - goto REPEAT; - } - default: - goto DONE; - } - } - catch (Exception ex) - { - state = -2; - completionSource.TrySetException(ex); - return; - } - - DONE: - state = -2; - completionSource.TrySetResult(false); - return; - - CONTINUE: - state = 0; - completionSource.TrySetResult(true); - return; - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - return enumerator.DisposeAsync(); - } - } - } - - internal sealed class WhereAwaitWithCancellation : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> predicate; - - public WhereAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> predicate) - { - this.source = source; - this.predicate = predicate; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _WhereAwaitWithCancellation(source, predicate, cancellationToken); - } - - sealed class _WhereAwaitWithCancellation : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> predicate; - readonly CancellationToken cancellationToken; - - int state = -1; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - UniTask.Awaiter awaiter2; - Action moveNextAction; - - public _WhereAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - { - this.source = source; - this.predicate = predicate; - this.cancellationToken = cancellationToken; - this.moveNextAction = MoveNext; - TaskTracker.TrackActiveTask(this, 3); - } - - public TSource Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (state == -2) return default; - - completionSource.Reset(); - MoveNext(); - return new UniTask(this, completionSource.Version); - } - - void MoveNext() - { - REPEAT: - try - { - switch (state) - { - case -1: // init - enumerator = source.GetAsyncEnumerator(cancellationToken); - goto case 0; - case 0: - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case 1; - } - else - { - state = 1; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case 1: - if (awaiter.GetResult()) - { - Current = enumerator.Current; - - awaiter2 = predicate(Current, cancellationToken).GetAwaiter(); - if (awaiter2.IsCompleted) - { - goto case 2; - } - else - { - state = 2; - awaiter2.UnsafeOnCompleted(moveNextAction); - return; - } - } - else - { - goto DONE; - } - case 2: - if (awaiter2.GetResult()) - { - goto CONTINUE; - } - else - { - state = 0; - goto REPEAT; - } - default: - goto DONE; - } - } - catch (Exception ex) - { - state = -2; - completionSource.TrySetException(ex); - return; - } - - DONE: - state = -2; - completionSource.TrySetResult(false); - return; - - CONTINUE: - state = 0; - completionSource.TrySetResult(true); - return; - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - return enumerator.DisposeAsync(); - } - } - } - - internal sealed class WhereIntAwaitWithCancellation : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> predicate; - - public WhereIntAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> predicate) - { - this.source = source; - this.predicate = predicate; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _WhereAwaitWithCancellation(source, predicate, cancellationToken); - } - - sealed class _WhereAwaitWithCancellation : MoveNextSource, IUniTaskAsyncEnumerator - { - readonly IUniTaskAsyncEnumerable source; - readonly Func> predicate; - readonly CancellationToken cancellationToken; - - int state = -1; - IUniTaskAsyncEnumerator enumerator; - UniTask.Awaiter awaiter; - UniTask.Awaiter awaiter2; - Action moveNextAction; - int index; - - public _WhereAwaitWithCancellation(IUniTaskAsyncEnumerable source, Func> predicate, CancellationToken cancellationToken) - { - this.source = source; - this.predicate = predicate; - this.cancellationToken = cancellationToken; - this.moveNextAction = MoveNext; - TaskTracker.TrackActiveTask(this, 3); - } - - public TSource Current { get; private set; } - - public UniTask MoveNextAsync() - { - if (state == -2) return default; - - completionSource.Reset(); - MoveNext(); - return new UniTask(this, completionSource.Version); - } - - void MoveNext() - { - REPEAT: - try - { - switch (state) - { - case -1: // init - enumerator = source.GetAsyncEnumerator(cancellationToken); - goto case 0; - case 0: - awaiter = enumerator.MoveNextAsync().GetAwaiter(); - if (awaiter.IsCompleted) - { - goto case 1; - } - else - { - state = 1; - awaiter.UnsafeOnCompleted(moveNextAction); - return; - } - case 1: - if (awaiter.GetResult()) - { - Current = enumerator.Current; - - awaiter2 = predicate(Current, checked(index++), cancellationToken).GetAwaiter(); - if (awaiter2.IsCompleted) - { - goto case 2; - } - else - { - state = 2; - awaiter2.UnsafeOnCompleted(moveNextAction); - return; - } - } - else - { - goto DONE; - } - case 2: - if (awaiter2.GetResult()) - { - goto CONTINUE; - } - else - { - state = 0; - goto REPEAT; - } - default: - goto DONE; - } - } - catch (Exception ex) - { - state = -2; - completionSource.TrySetException(ex); - return; - } - - DONE: - state = -2; - completionSource.TrySetResult(false); - return; - - CONTINUE: - state = 0; - completionSource.TrySetResult(true); - return; - } - - public UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - return enumerator.DisposeAsync(); - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Where.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Where.cs.meta deleted file mode 100644 index 7e503375..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Where.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d882a3238d9535e4e8ce1ad3291eb7fb -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Linq/Zip.cs b/VirtueSky/UniTask/Runtime/Linq/Zip.cs deleted file mode 100644 index 505d5341..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Zip.cs +++ /dev/null @@ -1,541 +0,0 @@ -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks.Linq -{ - public static partial class UniTaskAsyncEnumerable - { - - public static IUniTaskAsyncEnumerable<(TFirst First, TSecond Second)> Zip(this IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second) - { - Error.ThrowArgumentNullException(first, nameof(first)); - Error.ThrowArgumentNullException(second, nameof(second)); - - return Zip(first, second, (x, y) => (x, y)); - } - - public static IUniTaskAsyncEnumerable Zip(this IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, Func resultSelector) - { - Error.ThrowArgumentNullException(first, nameof(first)); - Error.ThrowArgumentNullException(second, nameof(second)); - Error.ThrowArgumentNullException(resultSelector, nameof(resultSelector)); - - return new Zip(first, second, resultSelector); - } - - public static IUniTaskAsyncEnumerable ZipAwait(this IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, Func> selector) - { - Error.ThrowArgumentNullException(first, nameof(first)); - Error.ThrowArgumentNullException(second, nameof(second)); - Error.ThrowArgumentNullException(selector, nameof(selector)); - - return new ZipAwait(first, second, selector); - } - - public static IUniTaskAsyncEnumerable ZipAwaitWithCancellation(this IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, Func> selector) - { - Error.ThrowArgumentNullException(first, nameof(first)); - Error.ThrowArgumentNullException(second, nameof(second)); - Error.ThrowArgumentNullException(selector, nameof(selector)); - - return new ZipAwaitWithCancellation(first, second, selector); - } - } - - internal sealed class Zip : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable first; - readonly IUniTaskAsyncEnumerable second; - readonly Func resultSelector; - - public Zip(IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, Func resultSelector) - { - this.first = first; - this.second = second; - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _Zip(first, second, resultSelector, cancellationToken); - } - - sealed class _Zip : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action firstMoveNextCoreDelegate = FirstMoveNextCore; - static readonly Action secondMoveNextCoreDelegate = SecondMoveNextCore; - - readonly IUniTaskAsyncEnumerable first; - readonly IUniTaskAsyncEnumerable second; - readonly Func resultSelector; - - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator firstEnumerator; - IUniTaskAsyncEnumerator secondEnumerator; - - UniTask.Awaiter firstAwaiter; - UniTask.Awaiter secondAwaiter; - - public _Zip(IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, Func resultSelector, CancellationToken cancellationToken) - { - this.first = first; - this.second = second; - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - completionSource.Reset(); - - if (firstEnumerator == null) - { - firstEnumerator = first.GetAsyncEnumerator(cancellationToken); - secondEnumerator = second.GetAsyncEnumerator(cancellationToken); - } - - firstAwaiter = firstEnumerator.MoveNextAsync().GetAwaiter(); - - if (firstAwaiter.IsCompleted) - { - FirstMoveNextCore(this); - } - else - { - firstAwaiter.SourceOnCompleted(firstMoveNextCoreDelegate, this); - } - - return new UniTask(this, completionSource.Version); - } - - static void FirstMoveNextCore(object state) - { - var self = (_Zip)state; - - if (self.TryGetResult(self.firstAwaiter, out var result)) - { - if (result) - { - try - { - self.secondAwaiter = self.secondEnumerator.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - return; - } - - if (self.secondAwaiter.IsCompleted) - { - SecondMoveNextCore(self); - } - else - { - self.secondAwaiter.SourceOnCompleted(secondMoveNextCoreDelegate, self); - } - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - - static void SecondMoveNextCore(object state) - { - var self = (_Zip)state; - - if (self.TryGetResult(self.secondAwaiter, out var result)) - { - if (result) - { - try - { - self.Current = self.resultSelector(self.firstEnumerator.Current, self.secondEnumerator.Current); - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - } - - if (self.cancellationToken.IsCancellationRequested) - { - self.completionSource.TrySetCanceled(self.cancellationToken); - } - else - { - self.completionSource.TrySetResult(true); - } - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (firstEnumerator != null) - { - await firstEnumerator.DisposeAsync(); - } - if (secondEnumerator != null) - { - await secondEnumerator.DisposeAsync(); - } - } - } - } - - internal sealed class ZipAwait : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable first; - readonly IUniTaskAsyncEnumerable second; - readonly Func> resultSelector; - - public ZipAwait(IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, Func> resultSelector) - { - this.first = first; - this.second = second; - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _ZipAwait(first, second, resultSelector, cancellationToken); - } - - sealed class _ZipAwait : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action firstMoveNextCoreDelegate = FirstMoveNextCore; - static readonly Action secondMoveNextCoreDelegate = SecondMoveNextCore; - static readonly Action resultAwaitCoreDelegate = ResultAwaitCore; - - readonly IUniTaskAsyncEnumerable first; - readonly IUniTaskAsyncEnumerable second; - readonly Func> resultSelector; - - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator firstEnumerator; - IUniTaskAsyncEnumerator secondEnumerator; - - UniTask.Awaiter firstAwaiter; - UniTask.Awaiter secondAwaiter; - UniTask.Awaiter resultAwaiter; - - public _ZipAwait(IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, Func> resultSelector, CancellationToken cancellationToken) - { - this.first = first; - this.second = second; - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - completionSource.Reset(); - - if (firstEnumerator == null) - { - firstEnumerator = first.GetAsyncEnumerator(cancellationToken); - secondEnumerator = second.GetAsyncEnumerator(cancellationToken); - } - - firstAwaiter = firstEnumerator.MoveNextAsync().GetAwaiter(); - - if (firstAwaiter.IsCompleted) - { - FirstMoveNextCore(this); - } - else - { - firstAwaiter.SourceOnCompleted(firstMoveNextCoreDelegate, this); - } - - return new UniTask(this, completionSource.Version); - } - - static void FirstMoveNextCore(object state) - { - var self = (_ZipAwait)state; - - if (self.TryGetResult(self.firstAwaiter, out var result)) - { - if (result) - { - try - { - self.secondAwaiter = self.secondEnumerator.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - return; - } - - if (self.secondAwaiter.IsCompleted) - { - SecondMoveNextCore(self); - } - else - { - self.secondAwaiter.SourceOnCompleted(secondMoveNextCoreDelegate, self); - } - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - - static void SecondMoveNextCore(object state) - { - var self = (_ZipAwait)state; - - if (self.TryGetResult(self.secondAwaiter, out var result)) - { - if (result) - { - try - { - self.resultAwaiter = self.resultSelector(self.firstEnumerator.Current, self.secondEnumerator.Current).GetAwaiter(); - if (self.resultAwaiter.IsCompleted) - { - ResultAwaitCore(self); - } - else - { - self.resultAwaiter.SourceOnCompleted(resultAwaitCoreDelegate, self); - } - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - } - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - - static void ResultAwaitCore(object state) - { - var self = (_ZipAwait)state; - - if (self.TryGetResult(self.resultAwaiter, out var result)) - { - self.Current = result; - - if (self.cancellationToken.IsCancellationRequested) - { - self.completionSource.TrySetCanceled(self.cancellationToken); - } - else - { - self.completionSource.TrySetResult(true); - } - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (firstEnumerator != null) - { - await firstEnumerator.DisposeAsync(); - } - if (secondEnumerator != null) - { - await secondEnumerator.DisposeAsync(); - } - } - } - } - - internal sealed class ZipAwaitWithCancellation : IUniTaskAsyncEnumerable - { - readonly IUniTaskAsyncEnumerable first; - readonly IUniTaskAsyncEnumerable second; - readonly Func> resultSelector; - - public ZipAwaitWithCancellation(IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, Func> resultSelector) - { - this.first = first; - this.second = second; - this.resultSelector = resultSelector; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new _ZipAwaitWithCancellation(first, second, resultSelector, cancellationToken); - } - - sealed class _ZipAwaitWithCancellation : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action firstMoveNextCoreDelegate = FirstMoveNextCore; - static readonly Action secondMoveNextCoreDelegate = SecondMoveNextCore; - static readonly Action resultAwaitCoreDelegate = ResultAwaitCore; - - readonly IUniTaskAsyncEnumerable first; - readonly IUniTaskAsyncEnumerable second; - readonly Func> resultSelector; - - CancellationToken cancellationToken; - - IUniTaskAsyncEnumerator firstEnumerator; - IUniTaskAsyncEnumerator secondEnumerator; - - UniTask.Awaiter firstAwaiter; - UniTask.Awaiter secondAwaiter; - UniTask.Awaiter resultAwaiter; - - public _ZipAwaitWithCancellation(IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, Func> resultSelector, CancellationToken cancellationToken) - { - this.first = first; - this.second = second; - this.resultSelector = resultSelector; - this.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(this, 3); - } - - public TResult Current { get; private set; } - - public UniTask MoveNextAsync() - { - completionSource.Reset(); - - if (firstEnumerator == null) - { - firstEnumerator = first.GetAsyncEnumerator(cancellationToken); - secondEnumerator = second.GetAsyncEnumerator(cancellationToken); - } - - firstAwaiter = firstEnumerator.MoveNextAsync().GetAwaiter(); - - if (firstAwaiter.IsCompleted) - { - FirstMoveNextCore(this); - } - else - { - firstAwaiter.SourceOnCompleted(firstMoveNextCoreDelegate, this); - } - - return new UniTask(this, completionSource.Version); - } - - static void FirstMoveNextCore(object state) - { - var self = (_ZipAwaitWithCancellation)state; - - if (self.TryGetResult(self.firstAwaiter, out var result)) - { - if (result) - { - try - { - self.secondAwaiter = self.secondEnumerator.MoveNextAsync().GetAwaiter(); - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - return; - } - - if (self.secondAwaiter.IsCompleted) - { - SecondMoveNextCore(self); - } - else - { - self.secondAwaiter.SourceOnCompleted(secondMoveNextCoreDelegate, self); - } - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - - static void SecondMoveNextCore(object state) - { - var self = (_ZipAwaitWithCancellation)state; - - if (self.TryGetResult(self.secondAwaiter, out var result)) - { - if (result) - { - try - { - self.resultAwaiter = self.resultSelector(self.firstEnumerator.Current, self.secondEnumerator.Current, self.cancellationToken).GetAwaiter(); - if (self.resultAwaiter.IsCompleted) - { - ResultAwaitCore(self); - } - else - { - self.resultAwaiter.SourceOnCompleted(resultAwaitCoreDelegate, self); - } - } - catch (Exception ex) - { - self.completionSource.TrySetException(ex); - } - } - else - { - self.completionSource.TrySetResult(false); - } - } - } - - static void ResultAwaitCore(object state) - { - var self = (_ZipAwaitWithCancellation)state; - - if (self.TryGetResult(self.resultAwaiter, out var result)) - { - self.Current = result; - - if (self.cancellationToken.IsCancellationRequested) - { - self.completionSource.TrySetCanceled(self.cancellationToken); - } - else - { - self.completionSource.TrySetResult(true); - } - } - } - - public async UniTask DisposeAsync() - { - TaskTracker.RemoveTracking(this); - if (firstEnumerator != null) - { - await firstEnumerator.DisposeAsync(); - } - if (secondEnumerator != null) - { - await secondEnumerator.DisposeAsync(); - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Linq/Zip.cs.meta b/VirtueSky/UniTask/Runtime/Linq/Zip.cs.meta deleted file mode 100644 index bf121637..00000000 --- a/VirtueSky/UniTask/Runtime/Linq/Zip.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: acc1acff153e347418f0f30b1c535994 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/MoveNextSource.cs b/VirtueSky/UniTask/Runtime/MoveNextSource.cs deleted file mode 100644 index fdd15805..00000000 --- a/VirtueSky/UniTask/Runtime/MoveNextSource.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; - -namespace VirtueSky.Threading.Tasks -{ - public abstract class MoveNextSource : IUniTaskSource - { - protected UniTaskCompletionSourceCore completionSource; - - public bool GetResult(short token) - { - return completionSource.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return completionSource.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - completionSource.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return completionSource.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - completionSource.GetResult(token); - } - - protected bool TryGetResult(UniTask.Awaiter awaiter, out T result) - { - try - { - result = awaiter.GetResult(); - return true; - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - result = default; - return false; - } - } - - protected bool TryGetResult(UniTask.Awaiter awaiter) - { - try - { - awaiter.GetResult(); - return true; - } - catch (Exception ex) - { - completionSource.TrySetException(ex); - return false; - } - } - } -} diff --git a/VirtueSky/UniTask/Runtime/MoveNextSource.cs.meta b/VirtueSky/UniTask/Runtime/MoveNextSource.cs.meta deleted file mode 100644 index 60a0908c..00000000 --- a/VirtueSky/UniTask/Runtime/MoveNextSource.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: dc4c5dc2a5f246e4f8df44cab735826c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/PlayerLoopHelper.cs b/VirtueSky/UniTask/Runtime/PlayerLoopHelper.cs deleted file mode 100644 index 74caa4fd..00000000 --- a/VirtueSky/UniTask/Runtime/PlayerLoopHelper.cs +++ /dev/null @@ -1,581 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Linq; -using UnityEngine; -using VirtueSky.Threading.Tasks.Internal; -using System.Threading; - -#if UNITY_2019_3_OR_NEWER -using UnityEngine.LowLevel; -using PlayerLoopType = UnityEngine.PlayerLoop; -#else -using UnityEngine.Experimental.LowLevel; -using PlayerLoopType = UnityEngine.Experimental.PlayerLoop; -#endif - -#if UNITY_EDITOR -using UnityEditor; -#endif - -namespace VirtueSky.Threading.Tasks -{ - public static class UniTaskLoopRunners - { - public struct UniTaskLoopRunnerInitialization { }; - public struct UniTaskLoopRunnerEarlyUpdate { }; - public struct UniTaskLoopRunnerFixedUpdate { }; - public struct UniTaskLoopRunnerPreUpdate { }; - public struct UniTaskLoopRunnerUpdate { }; - public struct UniTaskLoopRunnerPreLateUpdate { }; - public struct UniTaskLoopRunnerPostLateUpdate { }; - - // Last - - public struct UniTaskLoopRunnerLastInitialization { }; - public struct UniTaskLoopRunnerLastEarlyUpdate { }; - public struct UniTaskLoopRunnerLastFixedUpdate { }; - public struct UniTaskLoopRunnerLastPreUpdate { }; - public struct UniTaskLoopRunnerLastUpdate { }; - public struct UniTaskLoopRunnerLastPreLateUpdate { }; - public struct UniTaskLoopRunnerLastPostLateUpdate { }; - - // Yield - - public struct UniTaskLoopRunnerYieldInitialization { }; - public struct UniTaskLoopRunnerYieldEarlyUpdate { }; - public struct UniTaskLoopRunnerYieldFixedUpdate { }; - public struct UniTaskLoopRunnerYieldPreUpdate { }; - public struct UniTaskLoopRunnerYieldUpdate { }; - public struct UniTaskLoopRunnerYieldPreLateUpdate { }; - public struct UniTaskLoopRunnerYieldPostLateUpdate { }; - - // Yield Last - - public struct UniTaskLoopRunnerLastYieldInitialization { }; - public struct UniTaskLoopRunnerLastYieldEarlyUpdate { }; - public struct UniTaskLoopRunnerLastYieldFixedUpdate { }; - public struct UniTaskLoopRunnerLastYieldPreUpdate { }; - public struct UniTaskLoopRunnerLastYieldUpdate { }; - public struct UniTaskLoopRunnerLastYieldPreLateUpdate { }; - public struct UniTaskLoopRunnerLastYieldPostLateUpdate { }; - -#if UNITY_2020_2_OR_NEWER - public struct UniTaskLoopRunnerTimeUpdate { }; - public struct UniTaskLoopRunnerLastTimeUpdate { }; - public struct UniTaskLoopRunnerYieldTimeUpdate { }; - public struct UniTaskLoopRunnerLastYieldTimeUpdate { }; -#endif - } - - public enum PlayerLoopTiming - { - Initialization = 0, - LastInitialization = 1, - - EarlyUpdate = 2, - LastEarlyUpdate = 3, - - FixedUpdate = 4, - LastFixedUpdate = 5, - - PreUpdate = 6, - LastPreUpdate = 7, - - Update = 8, - LastUpdate = 9, - - PreLateUpdate = 10, - LastPreLateUpdate = 11, - - PostLateUpdate = 12, - LastPostLateUpdate = 13, - -#if UNITY_2020_2_OR_NEWER - // Unity 2020.2 added TimeUpdate https://docs.unity3d.com/2020.2/Documentation/ScriptReference/PlayerLoop.TimeUpdate.html - TimeUpdate = 14, - LastTimeUpdate = 15, -#endif - } - - [Flags] - public enum InjectPlayerLoopTimings - { - /// - /// Preset: All loops(default). - /// - All = - Initialization | LastInitialization | - EarlyUpdate | LastEarlyUpdate | - FixedUpdate | LastFixedUpdate | - PreUpdate | LastPreUpdate | - Update | LastUpdate | - PreLateUpdate | LastPreLateUpdate | - PostLateUpdate | LastPostLateUpdate -#if UNITY_2020_2_OR_NEWER - | TimeUpdate | LastTimeUpdate, -#else - , -#endif - - /// - /// Preset: All without last except LastPostLateUpdate. - /// - Standard = - Initialization | - EarlyUpdate | - FixedUpdate | - PreUpdate | - Update | - PreLateUpdate | - PostLateUpdate | LastPostLateUpdate -#if UNITY_2020_2_OR_NEWER - | TimeUpdate -#endif - , - - /// - /// Preset: Minimum pattern, Update | FixedUpdate | LastPostLateUpdate - /// - Minimum = - Update | FixedUpdate | LastPostLateUpdate, - - // PlayerLoopTiming - - Initialization = 1, - LastInitialization = 2, - - EarlyUpdate = 4, - LastEarlyUpdate = 8, - - FixedUpdate = 16, - LastFixedUpdate = 32, - - PreUpdate = 64, - LastPreUpdate = 128, - - Update = 256, - LastUpdate = 512, - - PreLateUpdate = 1024, - LastPreLateUpdate = 2048, - - PostLateUpdate = 4096, - LastPostLateUpdate = 8192 - -#if UNITY_2020_2_OR_NEWER - , - // Unity 2020.2 added TimeUpdate https://docs.unity3d.com/2020.2/Documentation/ScriptReference/PlayerLoop.TimeUpdate.html - TimeUpdate = 16384, - LastTimeUpdate = 32768 -#endif - } - - public interface IPlayerLoopItem - { - bool MoveNext(); - } - - public static class PlayerLoopHelper - { - static readonly ContinuationQueue ThrowMarkerContinuationQueue = new ContinuationQueue(PlayerLoopTiming.Initialization); - static readonly PlayerLoopRunner ThrowMarkerPlayerLoopRunner = new PlayerLoopRunner(PlayerLoopTiming.Initialization); - - public static SynchronizationContext UnitySynchronizationContext => unitySynchronizationContext; - public static int MainThreadId => mainThreadId; - internal static string ApplicationDataPath => applicationDataPath; - - public static bool IsMainThread => Thread.CurrentThread.ManagedThreadId == mainThreadId; - - static int mainThreadId; - static string applicationDataPath; - static SynchronizationContext unitySynchronizationContext; - static ContinuationQueue[] yielders; - static PlayerLoopRunner[] runners; - internal static bool IsEditorApplicationQuitting { get; private set; } - static PlayerLoopSystem[] InsertRunner(PlayerLoopSystem loopSystem, - bool injectOnFirst, - Type loopRunnerYieldType, ContinuationQueue cq, - Type loopRunnerType, PlayerLoopRunner runner) - { - -#if UNITY_EDITOR - EditorApplication.playModeStateChanged += (state) => - { - if (state == PlayModeStateChange.EnteredEditMode || state == PlayModeStateChange.ExitingEditMode) - { - IsEditorApplicationQuitting = true; - // run rest action before clear. - if (runner != null) - { - runner.Run(); - runner.Clear(); - } - if (cq != null) - { - cq.Run(); - cq.Clear(); - } - IsEditorApplicationQuitting = false; - } - }; -#endif - - var yieldLoop = new PlayerLoopSystem - { - type = loopRunnerYieldType, - updateDelegate = cq.Run - }; - - var runnerLoop = new PlayerLoopSystem - { - type = loopRunnerType, - updateDelegate = runner.Run - }; - - // Remove items from previous initializations. - var source = RemoveRunner(loopSystem, loopRunnerYieldType, loopRunnerType); - var dest = new PlayerLoopSystem[source.Length + 2]; - - Array.Copy(source, 0, dest, injectOnFirst ? 2 : 0, source.Length); - if (injectOnFirst) - { - dest[0] = yieldLoop; - dest[1] = runnerLoop; - } - else - { - dest[dest.Length - 2] = yieldLoop; - dest[dest.Length - 1] = runnerLoop; - } - - return dest; - } - - static PlayerLoopSystem[] RemoveRunner(PlayerLoopSystem loopSystem, Type loopRunnerYieldType, Type loopRunnerType) - { - return loopSystem.subSystemList - .Where(ls => ls.type != loopRunnerYieldType && ls.type != loopRunnerType) - .ToArray(); - } - - static PlayerLoopSystem[] InsertUniTaskSynchronizationContext(PlayerLoopSystem loopSystem) - { - var loop = new PlayerLoopSystem - { - type = typeof(UniTaskSynchronizationContext), - updateDelegate = UniTaskSynchronizationContext.Run - }; - - // Remove items from previous initializations. - var source = loopSystem.subSystemList - .Where(ls => ls.type != typeof(UniTaskSynchronizationContext)) - .ToArray(); - - var dest = new System.Collections.Generic.List(source); - - var index = dest.FindIndex(x => x.type.Name == "ScriptRunDelayedTasks"); - if (index == -1) - { - index = dest.FindIndex(x => x.type.Name == "UniTaskLoopRunnerUpdate"); - } - - dest.Insert(index + 1, loop); - - return dest.ToArray(); - } - -#if UNITY_2020_1_OR_NEWER - [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)] -#else - [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] -#endif - static void Init() - { - // capture default(unity) sync-context. - unitySynchronizationContext = SynchronizationContext.Current; - mainThreadId = Thread.CurrentThread.ManagedThreadId; - try - { - applicationDataPath = Application.dataPath; - } - catch { } - -#if UNITY_EDITOR && UNITY_2019_3_OR_NEWER - // When domain reload is disabled, re-initialization is required when entering play mode; - // otherwise, pending tasks will leak between play mode sessions. - var domainReloadDisabled = UnityEditor.EditorSettings.enterPlayModeOptionsEnabled && - UnityEditor.EditorSettings.enterPlayModeOptions.HasFlag(UnityEditor.EnterPlayModeOptions.DisableDomainReload); - if (!domainReloadDisabled && runners != null) return; -#else - if (runners != null) return; // already initialized -#endif - - var playerLoop = -#if UNITY_2019_3_OR_NEWER - PlayerLoop.GetCurrentPlayerLoop(); -#else - PlayerLoop.GetDefaultPlayerLoop(); -#endif - - Initialize(ref playerLoop); - } - - -#if UNITY_EDITOR - - [InitializeOnLoadMethod] - static void InitOnEditor() - { - // Execute the play mode init method - Init(); - - // register an Editor update delegate, used to forcing playerLoop update - EditorApplication.update += ForceEditorPlayerLoopUpdate; - } - - private static void ForceEditorPlayerLoopUpdate() - { - if (EditorApplication.isPlayingOrWillChangePlaymode || EditorApplication.isCompiling || EditorApplication.isUpdating) - { - // Not in Edit mode, don't interfere - return; - } - - // EditorApplication.QueuePlayerLoopUpdate causes performance issue, don't call directly. - // EditorApplication.QueuePlayerLoopUpdate(); - - if (yielders != null) - { - foreach (var item in yielders) - { - if (item != null) item.Run(); - } - } - - if (runners != null) - { - foreach (var item in runners) - { - if (item != null) item.Run(); - } - } - - UniTaskSynchronizationContext.Run(); - } - -#endif - - private static int FindLoopSystemIndex(PlayerLoopSystem[] playerLoopList, Type systemType) - { - for (int i = 0; i < playerLoopList.Length; i++) - { - if (playerLoopList[i].type == systemType) - { - return i; - } - } - - throw new Exception("Target PlayerLoopSystem does not found. Type:" + systemType.FullName); - } - - static void InsertLoop(PlayerLoopSystem[] copyList, InjectPlayerLoopTimings injectTimings, Type loopType, InjectPlayerLoopTimings targetTimings, - int index, bool injectOnFirst, Type loopRunnerYieldType, Type loopRunnerType, PlayerLoopTiming playerLoopTiming) - { - var i = FindLoopSystemIndex(copyList, loopType); - if ((injectTimings & targetTimings) == targetTimings) - { - copyList[i].subSystemList = InsertRunner(copyList[i], injectOnFirst, - loopRunnerYieldType, yielders[index] = new ContinuationQueue(playerLoopTiming), - loopRunnerType, runners[index] = new PlayerLoopRunner(playerLoopTiming)); - } - else - { - copyList[i].subSystemList = RemoveRunner(copyList[i], loopRunnerYieldType, loopRunnerType); - } - } - - public static void Initialize(ref PlayerLoopSystem playerLoop, InjectPlayerLoopTimings injectTimings = InjectPlayerLoopTimings.All) - { -#if UNITY_2020_2_OR_NEWER - yielders = new ContinuationQueue[16]; - runners = new PlayerLoopRunner[16]; -#else - yielders = new ContinuationQueue[14]; - runners = new PlayerLoopRunner[14]; -#endif - - var copyList = playerLoop.subSystemList.ToArray(); - - // Initialization - InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.Initialization), - InjectPlayerLoopTimings.Initialization, 0, true, - typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldInitialization), typeof(UniTaskLoopRunners.UniTaskLoopRunnerInitialization), PlayerLoopTiming.Initialization); - - InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.Initialization), - InjectPlayerLoopTimings.LastInitialization, 1, false, - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldInitialization), typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastInitialization), PlayerLoopTiming.LastInitialization); - - // EarlyUpdate - InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.EarlyUpdate), - InjectPlayerLoopTimings.EarlyUpdate, 2, true, - typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldEarlyUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerEarlyUpdate), PlayerLoopTiming.EarlyUpdate); - - InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.EarlyUpdate), - InjectPlayerLoopTimings.LastEarlyUpdate, 3, false, - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldEarlyUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastEarlyUpdate), PlayerLoopTiming.LastEarlyUpdate); - - // FixedUpdate - InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.FixedUpdate), - InjectPlayerLoopTimings.FixedUpdate, 4, true, - typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldFixedUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerFixedUpdate), PlayerLoopTiming.FixedUpdate); - - InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.FixedUpdate), - InjectPlayerLoopTimings.LastFixedUpdate, 5, false, - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldFixedUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastFixedUpdate), PlayerLoopTiming.LastFixedUpdate); - - // PreUpdate - InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.PreUpdate), - InjectPlayerLoopTimings.PreUpdate, 6, true, - typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldPreUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerPreUpdate), PlayerLoopTiming.PreUpdate); - - InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.PreUpdate), - InjectPlayerLoopTimings.LastPreUpdate, 7, false, - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldPreUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastPreUpdate), PlayerLoopTiming.LastPreUpdate); - - // Update - InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.Update), - InjectPlayerLoopTimings.Update, 8, true, - typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerUpdate), PlayerLoopTiming.Update); - - InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.Update), - InjectPlayerLoopTimings.LastUpdate, 9, false, - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastUpdate), PlayerLoopTiming.LastUpdate); - - // PreLateUpdate - InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.PreLateUpdate), - InjectPlayerLoopTimings.PreLateUpdate, 10, true, - typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldPreLateUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerPreLateUpdate), PlayerLoopTiming.PreLateUpdate); - - InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.PreLateUpdate), - InjectPlayerLoopTimings.LastPreLateUpdate, 11, false, - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldPreLateUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastPreLateUpdate), PlayerLoopTiming.LastPreLateUpdate); - - // PostLateUpdate - InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.PostLateUpdate), - InjectPlayerLoopTimings.PostLateUpdate, 12, true, - typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldPostLateUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerPostLateUpdate), PlayerLoopTiming.PostLateUpdate); - - InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.PostLateUpdate), - InjectPlayerLoopTimings.LastPostLateUpdate, 13, false, - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldPostLateUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastPostLateUpdate), PlayerLoopTiming.LastPostLateUpdate); - -#if UNITY_2020_2_OR_NEWER - // TimeUpdate - InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.TimeUpdate), - InjectPlayerLoopTimings.TimeUpdate, 14, true, - typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldTimeUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerTimeUpdate), PlayerLoopTiming.TimeUpdate); - - InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.TimeUpdate), - InjectPlayerLoopTimings.LastTimeUpdate, 15, false, - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldTimeUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastTimeUpdate), PlayerLoopTiming.LastTimeUpdate); -#endif - - // Insert UniTaskSynchronizationContext to Update loop - var i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.Update)); - copyList[i].subSystemList = InsertUniTaskSynchronizationContext(copyList[i]); - - playerLoop.subSystemList = copyList; - PlayerLoop.SetPlayerLoop(playerLoop); - } - - public static void AddAction(PlayerLoopTiming timing, IPlayerLoopItem action) - { - var runner = runners[(int)timing]; - if (runner == null) - { - ThrowInvalidLoopTiming(timing); - } - runner.AddAction(action); - } - - static void ThrowInvalidLoopTiming(PlayerLoopTiming playerLoopTiming) - { - throw new InvalidOperationException("Target playerLoopTiming is not injected. Please check PlayerLoopHelper.Initialize. PlayerLoopTiming:" + playerLoopTiming); - } - - public static void AddContinuation(PlayerLoopTiming timing, Action continuation) - { - var q = yielders[(int)timing]; - if (q == null) - { - ThrowInvalidLoopTiming(timing); - } - q.Enqueue(continuation); - } - - // Diagnostics helper - -#if UNITY_2019_3_OR_NEWER - - public static void DumpCurrentPlayerLoop() - { - var playerLoop = UnityEngine.LowLevel.PlayerLoop.GetCurrentPlayerLoop(); - - var sb = new System.Text.StringBuilder(); - sb.AppendLine($"PlayerLoop List"); - foreach (var header in playerLoop.subSystemList) - { - sb.AppendFormat("------{0}------", header.type.Name); - sb.AppendLine(); - - if (header.subSystemList is null) - { - sb.AppendFormat("{0} has no subsystems!", header.ToString()); - sb.AppendLine(); - continue; - } - - foreach (var subSystem in header.subSystemList) - { - sb.AppendFormat("{0}", subSystem.type.Name); - sb.AppendLine(); - - if (subSystem.subSystemList != null) - { - UnityEngine.Debug.LogWarning("More Subsystem:" + subSystem.subSystemList.Length); - } - } - } - - UnityEngine.Debug.Log(sb.ToString()); - } - - public static bool IsInjectedUniTaskPlayerLoop() - { - var playerLoop = UnityEngine.LowLevel.PlayerLoop.GetCurrentPlayerLoop(); - - foreach (var header in playerLoop.subSystemList) - { - if (header.subSystemList is null) - { - continue; - } - - foreach (var subSystem in header.subSystemList) - { - if (subSystem.type == typeof(UniTaskLoopRunners.UniTaskLoopRunnerInitialization)) - { - return true; - } - } - } - - return false; - } - -#endif - - } -} - diff --git a/VirtueSky/UniTask/Runtime/PlayerLoopHelper.cs.meta b/VirtueSky/UniTask/Runtime/PlayerLoopHelper.cs.meta deleted file mode 100644 index 2487ef77..00000000 --- a/VirtueSky/UniTask/Runtime/PlayerLoopHelper.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 15fb5b85042f19640b973ce651795aca -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/PlayerLoopTimer.cs b/VirtueSky/UniTask/Runtime/PlayerLoopTimer.cs deleted file mode 100644 index a50dafd8..00000000 --- a/VirtueSky/UniTask/Runtime/PlayerLoopTimer.cs +++ /dev/null @@ -1,262 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System.Threading; -using System; -using VirtueSky.Threading.Tasks.Internal; -using UnityEngine; - -namespace VirtueSky.Threading.Tasks -{ - public abstract class PlayerLoopTimer : IDisposable, IPlayerLoopItem - { - readonly CancellationToken cancellationToken; - readonly Action timerCallback; - readonly object state; - readonly PlayerLoopTiming playerLoopTiming; - readonly bool periodic; - - bool isRunning; - bool tryStop; - bool isDisposed; - - protected PlayerLoopTimer(bool periodic, PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken, Action timerCallback, object state) - { - this.periodic = periodic; - this.playerLoopTiming = playerLoopTiming; - this.cancellationToken = cancellationToken; - this.timerCallback = timerCallback; - this.state = state; - } - - public static PlayerLoopTimer Create(TimeSpan interval, bool periodic, DelayType delayType, PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken, Action timerCallback, object state) - { -#if UNITY_EDITOR - // force use Realtime. - if (PlayerLoopHelper.IsMainThread && !UnityEditor.EditorApplication.isPlaying) - { - delayType = DelayType.Realtime; - } -#endif - - switch (delayType) - { - case DelayType.UnscaledDeltaTime: - return new IgnoreTimeScalePlayerLoopTimer(interval, periodic, playerLoopTiming, cancellationToken, timerCallback, state); - case DelayType.Realtime: - return new RealtimePlayerLoopTimer(interval, periodic, playerLoopTiming, cancellationToken, timerCallback, state); - case DelayType.DeltaTime: - default: - return new DeltaTimePlayerLoopTimer(interval, periodic, playerLoopTiming, cancellationToken, timerCallback, state); - } - } - - public static PlayerLoopTimer StartNew(TimeSpan interval, bool periodic, DelayType delayType, PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken, Action timerCallback, object state) - { - var timer = Create(interval, periodic, delayType, playerLoopTiming, cancellationToken, timerCallback, state); - timer.Restart(); - return timer; - } - - /// - /// Restart(Reset and Start) timer. - /// - public void Restart() - { - if (isDisposed) throw new ObjectDisposedException(null); - - ResetCore(null); // init state - if (!isRunning) - { - isRunning = true; - PlayerLoopHelper.AddAction(playerLoopTiming, this); - } - tryStop = false; - } - - /// - /// Restart(Reset and Start) and change interval. - /// - public void Restart(TimeSpan interval) - { - if (isDisposed) throw new ObjectDisposedException(null); - - ResetCore(interval); // init state - if (!isRunning) - { - isRunning = true; - PlayerLoopHelper.AddAction(playerLoopTiming, this); - } - tryStop = false; - } - - /// - /// Stop timer. - /// - public void Stop() - { - tryStop = true; - } - - protected abstract void ResetCore(TimeSpan? newInterval); - - public void Dispose() - { - isDisposed = true; - } - - bool IPlayerLoopItem.MoveNext() - { - if (isDisposed) - { - isRunning = false; - return false; - } - if (tryStop) - { - isRunning = false; - return false; - } - if (cancellationToken.IsCancellationRequested) - { - isRunning = false; - return false; - } - - if (!MoveNextCore()) - { - timerCallback(state); - - if (periodic) - { - ResetCore(null); - return true; - } - else - { - isRunning = false; - return false; - } - } - - return true; - } - - protected abstract bool MoveNextCore(); - } - - sealed class DeltaTimePlayerLoopTimer : PlayerLoopTimer - { - int initialFrame; - float elapsed; - float interval; - - public DeltaTimePlayerLoopTimer(TimeSpan interval, bool periodic, PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken, Action timerCallback, object state) - : base(periodic, playerLoopTiming, cancellationToken, timerCallback, state) - { - ResetCore(interval); - } - - protected override bool MoveNextCore() - { - if (elapsed == 0.0f) - { - if (initialFrame == Time.frameCount) - { - return true; - } - } - - elapsed += Time.deltaTime; - if (elapsed >= interval) - { - return false; - } - - return true; - } - - protected override void ResetCore(TimeSpan? interval) - { - this.elapsed = 0.0f; - this.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1; - if (interval != null) - { - this.interval = (float)interval.Value.TotalSeconds; - } - } - } - - sealed class IgnoreTimeScalePlayerLoopTimer : PlayerLoopTimer - { - int initialFrame; - float elapsed; - float interval; - - public IgnoreTimeScalePlayerLoopTimer(TimeSpan interval, bool periodic, PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken, Action timerCallback, object state) - : base(periodic, playerLoopTiming, cancellationToken, timerCallback, state) - { - ResetCore(interval); - } - - protected override bool MoveNextCore() - { - if (elapsed == 0.0f) - { - if (initialFrame == Time.frameCount) - { - return true; - } - } - - elapsed += Time.unscaledDeltaTime; - if (elapsed >= interval) - { - return false; - } - - return true; - } - - protected override void ResetCore(TimeSpan? interval) - { - this.elapsed = 0.0f; - this.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1; - if (interval != null) - { - this.interval = (float)interval.Value.TotalSeconds; - } - } - } - - sealed class RealtimePlayerLoopTimer : PlayerLoopTimer - { - ValueStopwatch stopwatch; - long intervalTicks; - - public RealtimePlayerLoopTimer(TimeSpan interval, bool periodic, PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken, Action timerCallback, object state) - : base(periodic, playerLoopTiming, cancellationToken, timerCallback, state) - { - ResetCore(interval); - } - - protected override bool MoveNextCore() - { - if (stopwatch.ElapsedTicks >= intervalTicks) - { - return false; - } - - return true; - } - - protected override void ResetCore(TimeSpan? interval) - { - this.stopwatch = ValueStopwatch.StartNew(); - if (interval != null) - { - this.intervalTicks = interval.Value.Ticks; - } - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/PlayerLoopTimer.cs.meta b/VirtueSky/UniTask/Runtime/PlayerLoopTimer.cs.meta deleted file mode 100644 index eb2b50a0..00000000 --- a/VirtueSky/UniTask/Runtime/PlayerLoopTimer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 57095a17fdca7ee4380450910afc7f26 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Progress.cs b/VirtueSky/UniTask/Runtime/Progress.cs deleted file mode 100644 index 83adfac5..00000000 --- a/VirtueSky/UniTask/Runtime/Progress.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System; -using System.Collections.Generic; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks -{ - /// - /// Lightweight IProgress[T] factory. - /// - public static class Progress - { - public static IProgress Create(Action handler) - { - if (handler == null) return NullProgress.Instance; - return new AnonymousProgress(handler); - } - - public static IProgress CreateOnlyValueChanged(Action handler, IEqualityComparer comparer = null) - { - if (handler == null) return NullProgress.Instance; -#if UNITY_2018_3_OR_NEWER - return new OnlyValueChangedProgress(handler, comparer ?? UnityEqualityComparer.GetDefault()); -#else - return new OnlyValueChangedProgress(handler, comparer ?? EqualityComparer.Default); -#endif - } - - sealed class NullProgress : IProgress - { - public static readonly IProgress Instance = new NullProgress(); - - NullProgress() - { - - } - - public void Report(T value) - { - } - } - - sealed class AnonymousProgress : IProgress - { - readonly Action action; - - public AnonymousProgress(Action action) - { - this.action = action; - } - - public void Report(T value) - { - action(value); - } - } - - sealed class OnlyValueChangedProgress : IProgress - { - readonly Action action; - readonly IEqualityComparer comparer; - bool isFirstCall; - T latestValue; - - public OnlyValueChangedProgress(Action action, IEqualityComparer comparer) - { - this.action = action; - this.comparer = comparer; - this.isFirstCall = true; - } - - public void Report(T value) - { - if (isFirstCall) - { - isFirstCall = false; - } - else if (comparer.Equals(value, latestValue)) - { - return; - } - - latestValue = value; - action(value); - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Progress.cs.meta b/VirtueSky/UniTask/Runtime/Progress.cs.meta deleted file mode 100644 index f0e1f197..00000000 --- a/VirtueSky/UniTask/Runtime/Progress.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e3377e2ae934ed54fb8fd5388e2d9eb9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/TaskPool.cs b/VirtueSky/UniTask/Runtime/TaskPool.cs deleted file mode 100644 index c874044e..00000000 --- a/VirtueSky/UniTask/Runtime/TaskPool.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Threading; - -namespace VirtueSky.Threading.Tasks -{ - // internally used but public, allow to user create custom operator with pooling. - - public static class TaskPool - { - internal static int MaxPoolSize; - - // avoid to use ConcurrentDictionary for safety of WebGL build. - static Dictionary> sizes = new Dictionary>(); - - static TaskPool() - { - try - { - var value = Environment.GetEnvironmentVariable("UNITASK_MAX_POOLSIZE"); - if (value != null) - { - if (int.TryParse(value, out var size)) - { - MaxPoolSize = size; - return; - } - } - } - catch { } - - MaxPoolSize = int.MaxValue; - } - - public static void SetMaxPoolSize(int maxPoolSize) - { - MaxPoolSize = maxPoolSize; - } - - public static IEnumerable<(Type, int)> GetCacheSizeInfo() - { - lock (sizes) - { - foreach (var item in sizes) - { - yield return (item.Key, item.Value()); - } - } - } - - public static void RegisterSizeGetter(Type type, Func getSize) - { - lock (sizes) - { - sizes[type] = getSize; - } - } - } - - public interface ITaskPoolNode - { - ref T NextNode { get; } - } - - // mutable struct, don't mark readonly. - [StructLayout(LayoutKind.Auto)] - public struct TaskPool - where T : class, ITaskPoolNode - { - int gate; - int size; - T root; - - public int Size => size; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool TryPop(out T result) - { - if (Interlocked.CompareExchange(ref gate, 1, 0) == 0) - { - var v = root; - if (!(v is null)) - { - ref var nextNode = ref v.NextNode; - root = nextNode; - nextNode = null; - size--; - result = v; - Volatile.Write(ref gate, 0); - return true; - } - - Volatile.Write(ref gate, 0); - } - result = default; - return false; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool TryPush(T item) - { - if (Interlocked.CompareExchange(ref gate, 1, 0) == 0) - { - if (size < TaskPool.MaxPoolSize) - { - item.NextNode = root; - root = item; - size++; - Volatile.Write(ref gate, 0); - return true; - } - else - { - Volatile.Write(ref gate, 0); - } - } - return false; - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/TaskPool.cs.meta b/VirtueSky/UniTask/Runtime/TaskPool.cs.meta deleted file mode 100644 index 94c78058..00000000 --- a/VirtueSky/UniTask/Runtime/TaskPool.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 19f4e6575150765449cc99f25f06f25f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/TimeoutController.cs b/VirtueSky/UniTask/Runtime/TimeoutController.cs deleted file mode 100644 index 6af69ef5..00000000 --- a/VirtueSky/UniTask/Runtime/TimeoutController.cs +++ /dev/null @@ -1,129 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks -{ - // CancellationTokenSource itself can not reuse but CancelAfter(Timeout.InfiniteTimeSpan) allows reuse if did not reach timeout. - // Similar discussion: - // https://github.com/dotnet/runtime/issues/4694 - // https://github.com/dotnet/runtime/issues/48492 - // This TimeoutController emulate similar implementation, using CancelAfterSlim; to achieve zero allocation timeout. - - public sealed class TimeoutController : IDisposable - { - readonly static Action CancelCancellationTokenSourceStateDelegate = new Action(CancelCancellationTokenSourceState); - - static void CancelCancellationTokenSourceState(object state) - { - var cts = (CancellationTokenSource)state; - cts.Cancel(); - } - - CancellationTokenSource timeoutSource; - CancellationTokenSource linkedSource; - PlayerLoopTimer timer; - bool isDisposed; - - readonly DelayType delayType; - readonly PlayerLoopTiming delayTiming; - readonly CancellationTokenSource originalLinkCancellationTokenSource; - - public TimeoutController(DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update) - { - this.timeoutSource = new CancellationTokenSource(); - this.originalLinkCancellationTokenSource = null; - this.linkedSource = null; - this.delayType = delayType; - this.delayTiming = delayTiming; - } - - public TimeoutController(CancellationTokenSource linkCancellationTokenSource, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update) - { - this.timeoutSource = new CancellationTokenSource(); - this.originalLinkCancellationTokenSource = linkCancellationTokenSource; - this.linkedSource = CancellationTokenSource.CreateLinkedTokenSource(timeoutSource.Token, linkCancellationTokenSource.Token); - this.delayType = delayType; - this.delayTiming = delayTiming; - } - - public CancellationToken Timeout(int millisecondsTimeout) - { - return Timeout(TimeSpan.FromMilliseconds(millisecondsTimeout)); - } - - public CancellationToken Timeout(TimeSpan timeout) - { - if (originalLinkCancellationTokenSource != null && originalLinkCancellationTokenSource.IsCancellationRequested) - { - return originalLinkCancellationTokenSource.Token; - } - - // Timeouted, create new source and timer. - if (timeoutSource.IsCancellationRequested) - { - timeoutSource.Dispose(); - timeoutSource = new CancellationTokenSource(); - if (linkedSource != null) - { - this.linkedSource.Cancel(); - this.linkedSource.Dispose(); - this.linkedSource = CancellationTokenSource.CreateLinkedTokenSource(timeoutSource.Token, originalLinkCancellationTokenSource.Token); - } - - timer?.Dispose(); - timer = null; - } - - var useSource = (linkedSource != null) ? linkedSource : timeoutSource; - var token = useSource.Token; - if (timer == null) - { - // Timer complete => timeoutSource.Cancel() -> linkedSource will be canceled. - // (linked)token is canceled => stop timer - timer = PlayerLoopTimer.StartNew(timeout, false, delayType, delayTiming, token, CancelCancellationTokenSourceStateDelegate, timeoutSource); - } - else - { - timer.Restart(timeout); - } - - return token; - } - - public bool IsTimeout() - { - return timeoutSource.IsCancellationRequested; - } - - public void Reset() - { - timer?.Stop(); - } - - public void Dispose() - { - if (isDisposed) return; - - try - { - // stop timer. - timer?.Dispose(); - - // cancel and dispose. - timeoutSource.Cancel(); - timeoutSource.Dispose(); - if (linkedSource != null) - { - linkedSource.Cancel(); - linkedSource.Dispose(); - } - } - finally - { - isDisposed = true; - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/TimeoutController.cs.meta b/VirtueSky/UniTask/Runtime/TimeoutController.cs.meta deleted file mode 100644 index 4f3d16d9..00000000 --- a/VirtueSky/UniTask/Runtime/TimeoutController.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6347ab34d2db6d744a654e8d62d96b96 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/TriggerEvent.cs b/VirtueSky/UniTask/Runtime/TriggerEvent.cs deleted file mode 100644 index 0afcfa44..00000000 --- a/VirtueSky/UniTask/Runtime/TriggerEvent.cs +++ /dev/null @@ -1,291 +0,0 @@ -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks -{ - public interface ITriggerHandler - { - void OnNext(T value); - void OnError(Exception ex); - void OnCompleted(); - void OnCanceled(CancellationToken cancellationToken); - - // set/get from TriggerEvent - ITriggerHandler Prev { get; set; } - ITriggerHandler Next { get; set; } - } - - // be careful to use, itself is struct. - public struct TriggerEvent - { - ITriggerHandler head; // head.prev is last - ITriggerHandler iteratingHead; - ITriggerHandler iteratingNode; - - void LogError(Exception ex) - { -#if UNITY_2018_3_OR_NEWER - UnityEngine.Debug.LogException(ex); -#else - Console.WriteLine(ex); -#endif - } - - public void SetResult(T value) - { - if (iteratingNode != null) - { - throw new InvalidOperationException("Can not trigger itself in iterating."); - } - - var h = head; - while (h != null) - { - iteratingNode = h; - - try - { - h.OnNext(value); - } - catch (Exception ex) - { - LogError(ex); - Remove(h); - } - - // If `h` itself is removed by OnNext, h.Next is null. - // Therefore, instead of looking at h.Next, the `iteratingNode` reference itself is replaced. - h = h == iteratingNode ? h.Next : iteratingNode; - } - - iteratingNode = null; - if (iteratingHead != null) - { - Add(iteratingHead); - iteratingHead = null; - } - } - - public void SetCanceled(CancellationToken cancellationToken) - { - if (iteratingNode != null) - { - throw new InvalidOperationException("Can not trigger itself in iterating."); - } - - var h = head; - while (h != null) - { - iteratingNode = h; - try - { - h.OnCanceled(cancellationToken); - } - catch (Exception ex) - { - LogError(ex); - } - - var next = h == iteratingNode ? h.Next : iteratingNode; - iteratingNode = null; - Remove(h); - h = next; - } - - iteratingNode = null; - if (iteratingHead != null) - { - Add(iteratingHead); - iteratingHead = null; - } - } - - public void SetCompleted() - { - if (iteratingNode != null) - { - throw new InvalidOperationException("Can not trigger itself in iterating."); - } - - var h = head; - while (h != null) - { - iteratingNode = h; - try - { - h.OnCompleted(); - } - catch (Exception ex) - { - LogError(ex); - } - - var next = h == iteratingNode ? h.Next : iteratingNode; - iteratingNode = null; - Remove(h); - h = next; - } - - iteratingNode = null; - if (iteratingHead != null) - { - Add(iteratingHead); - iteratingHead = null; - } - } - - public void SetError(Exception exception) - { - if (iteratingNode != null) - { - throw new InvalidOperationException("Can not trigger itself in iterating."); - } - - var h = head; - while (h != null) - { - iteratingNode = h; - try - { - h.OnError(exception); - } - catch (Exception ex) - { - LogError(ex); - } - - var next = h == iteratingNode ? h.Next : iteratingNode; - iteratingNode = null; - Remove(h); - h = next; - } - - iteratingNode = null; - if (iteratingHead != null) - { - Add(iteratingHead); - iteratingHead = null; - } - } - - public void Add(ITriggerHandler handler) - { - if (handler == null) throw new ArgumentNullException(nameof(handler)); - - // zero node. - if (head == null) - { - head = handler; - return; - } - - if (iteratingNode != null) - { - if (iteratingHead == null) - { - iteratingHead = handler; - return; - } - - var last = iteratingHead.Prev; - if (last == null) - { - // single node. - iteratingHead.Prev = handler; - iteratingHead.Next = handler; - handler.Prev = iteratingHead; - } - else - { - // multi node - iteratingHead.Prev = handler; - last.Next = handler; - handler.Prev = last; - } - } - else - { - var last = head.Prev; - if (last == null) - { - // single node. - head.Prev = handler; - head.Next = handler; - handler.Prev = head; - } - else - { - // multi node - head.Prev = handler; - last.Next = handler; - handler.Prev = last; - } - } - } - - public void Remove(ITriggerHandler handler) - { - if (handler == null) throw new ArgumentNullException(nameof(handler)); - - var prev = handler.Prev; - var next = handler.Next; - - if (next != null) - { - next.Prev = prev; - } - - if (handler == head) - { - head = next; - } - // when handler is head, prev indicate last so don't use it. - else if (prev != null) - { - prev.Next = next; - } - - if (handler == iteratingNode) - { - iteratingNode = next; - } - if (handler == iteratingHead) - { - iteratingHead = next; - } - - if (head != null) - { - if (head.Prev == handler) - { - if (prev != head) - { - head.Prev = prev; - } - else - { - head.Prev = null; - } - } - } - - if (iteratingHead != null) - { - if (iteratingHead.Prev == handler) - { - if (prev != iteratingHead.Prev) - { - iteratingHead.Prev = prev; - } - else - { - iteratingHead.Prev = null; - } - } - } - - handler.Prev = null; - handler.Next = null; - } - } -} diff --git a/VirtueSky/UniTask/Runtime/TriggerEvent.cs.meta b/VirtueSky/UniTask/Runtime/TriggerEvent.cs.meta deleted file mode 100644 index bbd47af7..00000000 --- a/VirtueSky/UniTask/Runtime/TriggerEvent.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f68b22bb8f66f5c4885f9bd3c4fc43ed -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Triggers.meta b/VirtueSky/UniTask/Runtime/Triggers.meta deleted file mode 100644 index 42fa583b..00000000 --- a/VirtueSky/UniTask/Runtime/Triggers.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 26daefd0010059b43a5545d6910b9406 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Triggers/AsyncAwakeTrigger.cs b/VirtueSky/UniTask/Runtime/Triggers/AsyncAwakeTrigger.cs deleted file mode 100644 index 61c05819..00000000 --- a/VirtueSky/UniTask/Runtime/Triggers/AsyncAwakeTrigger.cs +++ /dev/null @@ -1,32 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System.Threading; -using UnityEngine; - -namespace VirtueSky.Threading.Tasks.Triggers -{ - public static partial class AsyncTriggerExtensions - { - public static AsyncAwakeTrigger GetAsyncAwakeTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncAwakeTrigger GetAsyncAwakeTrigger(this Component component) - { - return component.gameObject.GetAsyncAwakeTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncAwakeTrigger : AsyncTriggerBase - { - public UniTask AwakeAsync() - { - if (calledAwake) return UniTask.CompletedTask; - - return ((IAsyncOneShotTrigger)new AsyncTriggerHandler(this, true)).OneShotAsync(); - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/Triggers/AsyncAwakeTrigger.cs.meta b/VirtueSky/UniTask/Runtime/Triggers/AsyncAwakeTrigger.cs.meta deleted file mode 100644 index 097fdb61..00000000 --- a/VirtueSky/UniTask/Runtime/Triggers/AsyncAwakeTrigger.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ef2840a2586894741a0ae211b8fd669b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Triggers/AsyncDestroyTrigger.cs b/VirtueSky/UniTask/Runtime/Triggers/AsyncDestroyTrigger.cs deleted file mode 100644 index 699df2cd..00000000 --- a/VirtueSky/UniTask/Runtime/Triggers/AsyncDestroyTrigger.cs +++ /dev/null @@ -1,95 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System.Threading; -using UnityEngine; - -namespace VirtueSky.Threading.Tasks.Triggers -{ - public static partial class AsyncTriggerExtensions - { - public static AsyncDestroyTrigger GetAsyncDestroyTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncDestroyTrigger GetAsyncDestroyTrigger(this Component component) - { - return component.gameObject.GetAsyncDestroyTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncDestroyTrigger : MonoBehaviour - { - bool awakeCalled = false; - bool called = false; - CancellationTokenSource cancellationTokenSource; - - public CancellationToken CancellationToken - { - get - { - if (cancellationTokenSource == null) - { - cancellationTokenSource = new CancellationTokenSource(); - if (!awakeCalled) - { - PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, new AwakeMonitor(this)); - } - } - return cancellationTokenSource.Token; - } - } - - void Awake() - { - awakeCalled = true; - } - - void OnDestroy() - { - called = true; - - cancellationTokenSource?.Cancel(); - cancellationTokenSource?.Dispose(); - } - - public UniTask OnDestroyAsync() - { - if (called) return UniTask.CompletedTask; - - var tcs = new UniTaskCompletionSource(); - - // OnDestroy = Called Cancel. - CancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var tcs2 = (UniTaskCompletionSource)state; - tcs2.TrySetResult(); - }, tcs); - - return tcs.Task; - } - - class AwakeMonitor : IPlayerLoopItem - { - readonly AsyncDestroyTrigger trigger; - - public AwakeMonitor(AsyncDestroyTrigger trigger) - { - this.trigger = trigger; - } - - public bool MoveNext() - { - if (trigger.called || trigger.awakeCalled) return false; - if (trigger == null) - { - trigger.OnDestroy(); - return false; - } - return true; - } - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/Triggers/AsyncDestroyTrigger.cs.meta b/VirtueSky/UniTask/Runtime/Triggers/AsyncDestroyTrigger.cs.meta deleted file mode 100644 index 64500494..00000000 --- a/VirtueSky/UniTask/Runtime/Triggers/AsyncDestroyTrigger.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f4afdcb1cbadf954ba8b1cf465429e17 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Triggers/AsyncStartTrigger.cs b/VirtueSky/UniTask/Runtime/Triggers/AsyncStartTrigger.cs deleted file mode 100644 index 58161e2b..00000000 --- a/VirtueSky/UniTask/Runtime/Triggers/AsyncStartTrigger.cs +++ /dev/null @@ -1,38 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using UnityEngine; - -namespace VirtueSky.Threading.Tasks.Triggers -{ - public static partial class AsyncTriggerExtensions - { - public static AsyncStartTrigger GetAsyncStartTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncStartTrigger GetAsyncStartTrigger(this Component component) - { - return component.gameObject.GetAsyncStartTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncStartTrigger : AsyncTriggerBase - { - bool called; - - void Start() - { - called = true; - RaiseEvent(AsyncUnit.Default); - } - - public UniTask StartAsync() - { - if (called) return UniTask.CompletedTask; - - return ((IAsyncOneShotTrigger)new AsyncTriggerHandler(this, true)).OneShotAsync(); - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Triggers/AsyncStartTrigger.cs.meta b/VirtueSky/UniTask/Runtime/Triggers/AsyncStartTrigger.cs.meta deleted file mode 100644 index 9ef06e8e..00000000 --- a/VirtueSky/UniTask/Runtime/Triggers/AsyncStartTrigger.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b4fd0f75e54ec3d4fbcb7fc65b11646b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Triggers/AsyncTriggerBase.cs b/VirtueSky/UniTask/Runtime/Triggers/AsyncTriggerBase.cs deleted file mode 100644 index ff8e3c71..00000000 --- a/VirtueSky/UniTask/Runtime/Triggers/AsyncTriggerBase.cs +++ /dev/null @@ -1,310 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Threading; -using UnityEngine; - -namespace VirtueSky.Threading.Tasks.Triggers -{ - public abstract class AsyncTriggerBase : MonoBehaviour, IUniTaskAsyncEnumerable - { - TriggerEvent triggerEvent; - - internal protected bool calledAwake; - internal protected bool calledDestroy; - - void Awake() - { - calledAwake = true; - } - - void OnDestroy() - { - if (calledDestroy) return; - calledDestroy = true; - - triggerEvent.SetCompleted(); - } - - internal void AddHandler(ITriggerHandler handler) - { - if (!calledAwake) - { - PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, new AwakeMonitor(this)); - } - - triggerEvent.Add(handler); - } - - internal void RemoveHandler(ITriggerHandler handler) - { - if (!calledAwake) - { - PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, new AwakeMonitor(this)); - } - - triggerEvent.Remove(handler); - } - - protected void RaiseEvent(T value) - { - triggerEvent.SetResult(value); - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - return new AsyncTriggerEnumerator(this, cancellationToken); - } - - sealed class AsyncTriggerEnumerator : MoveNextSource, IUniTaskAsyncEnumerator, ITriggerHandler - { - static Action cancellationCallback = CancellationCallback; - - readonly AsyncTriggerBase parent; - CancellationToken cancellationToken; - CancellationTokenRegistration registration; - bool called; - bool isDisposed; - - public AsyncTriggerEnumerator(AsyncTriggerBase parent, CancellationToken cancellationToken) - { - this.parent = parent; - this.cancellationToken = cancellationToken; - } - - public void OnCanceled(CancellationToken cancellationToken = default) - { - completionSource.TrySetCanceled(cancellationToken); - } - - public void OnNext(T value) - { - Current = value; - completionSource.TrySetResult(true); - } - - public void OnCompleted() - { - completionSource.TrySetResult(false); - } - - public void OnError(Exception ex) - { - completionSource.TrySetException(ex); - } - - static void CancellationCallback(object state) - { - var self = (AsyncTriggerEnumerator)state; - self.DisposeAsync().Forget(); // sync - - self.completionSource.TrySetCanceled(self.cancellationToken); - } - - public T Current { get; private set; } - ITriggerHandler ITriggerHandler.Prev { get; set; } - ITriggerHandler ITriggerHandler.Next { get; set; } - - public UniTask MoveNextAsync() - { - cancellationToken.ThrowIfCancellationRequested(); - completionSource.Reset(); - - if (!called) - { - called = true; - - TaskTracker.TrackActiveTask(this, 3); - parent.AddHandler(this); - if (cancellationToken.CanBeCanceled) - { - registration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, this); - } - } - - return new UniTask(this, completionSource.Version); - } - - public UniTask DisposeAsync() - { - if (!isDisposed) - { - isDisposed = true; - TaskTracker.RemoveTracking(this); - registration.Dispose(); - parent.RemoveHandler(this); - } - - return default; - } - } - - class AwakeMonitor : IPlayerLoopItem - { - readonly AsyncTriggerBase trigger; - - public AwakeMonitor(AsyncTriggerBase trigger) - { - this.trigger = trigger; - } - - public bool MoveNext() - { - if (trigger.calledAwake) return false; - if (trigger == null) - { - trigger.OnDestroy(); - return false; - } - return true; - } - } - } - - public interface IAsyncOneShotTrigger - { - UniTask OneShotAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOneShotTrigger - { - UniTask IAsyncOneShotTrigger.OneShotAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)this, core.Version); - } - } - - public sealed partial class AsyncTriggerHandler : IUniTaskSource, ITriggerHandler, IDisposable - { - static Action cancellationCallback = CancellationCallback; - - readonly AsyncTriggerBase trigger; - - CancellationToken cancellationToken; - CancellationTokenRegistration registration; - bool isDisposed; - bool callOnce; - - UniTaskCompletionSourceCore core; - - internal CancellationToken CancellationToken => cancellationToken; - - ITriggerHandler ITriggerHandler.Prev { get; set; } - ITriggerHandler ITriggerHandler.Next { get; set; } - - internal AsyncTriggerHandler(AsyncTriggerBase trigger, bool callOnce) - { - if (cancellationToken.IsCancellationRequested) - { - isDisposed = true; - return; - } - - this.trigger = trigger; - this.cancellationToken = default; - this.registration = default; - this.callOnce = callOnce; - - trigger.AddHandler(this); - - TaskTracker.TrackActiveTask(this, 3); - } - - internal AsyncTriggerHandler(AsyncTriggerBase trigger, CancellationToken cancellationToken, bool callOnce) - { - if (cancellationToken.IsCancellationRequested) - { - isDisposed = true; - return; - } - - this.trigger = trigger; - this.cancellationToken = cancellationToken; - this.callOnce = callOnce; - - trigger.AddHandler(this); - - if (cancellationToken.CanBeCanceled) - { - registration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, this); - } - - TaskTracker.TrackActiveTask(this, 3); - } - - static void CancellationCallback(object state) - { - var self = (AsyncTriggerHandler)state; - self.Dispose(); - - self.core.TrySetCanceled(self.cancellationToken); - } - - public void Dispose() - { - if (!isDisposed) - { - isDisposed = true; - TaskTracker.RemoveTracking(this); - registration.Dispose(); - trigger.RemoveHandler(this); - } - } - - T IUniTaskSource.GetResult(short token) - { - try - { - return core.GetResult(token); - } - finally - { - if (callOnce) - { - Dispose(); - } - } - } - - void ITriggerHandler.OnNext(T value) - { - core.TrySetResult(value); - } - - void ITriggerHandler.OnCanceled(CancellationToken cancellationToken) - { - core.TrySetCanceled(cancellationToken); - } - - void ITriggerHandler.OnCompleted() - { - core.TrySetCanceled(CancellationToken.None); - } - - void ITriggerHandler.OnError(Exception ex) - { - core.TrySetException(ex); - } - - void IUniTaskSource.GetResult(short token) - { - ((IUniTaskSource)this).GetResult(token); - } - - UniTaskStatus IUniTaskSource.GetStatus(short token) - { - return core.GetStatus(token); - } - - UniTaskStatus IUniTaskSource.UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Triggers/AsyncTriggerBase.cs.meta b/VirtueSky/UniTask/Runtime/Triggers/AsyncTriggerBase.cs.meta deleted file mode 100644 index e101ea2d..00000000 --- a/VirtueSky/UniTask/Runtime/Triggers/AsyncTriggerBase.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2c0c2bcee832c6641b25949c412f020f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Triggers/AsyncTriggerExtensions.cs b/VirtueSky/UniTask/Runtime/Triggers/AsyncTriggerExtensions.cs deleted file mode 100644 index fe8641fc..00000000 --- a/VirtueSky/UniTask/Runtime/Triggers/AsyncTriggerExtensions.cs +++ /dev/null @@ -1,102 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System.Threading; -using UnityEngine; -using VirtueSky.Threading.Tasks.Triggers; - -namespace VirtueSky.Threading.Tasks -{ - public static class UniTaskCancellationExtensions - { -#if UNITY_2022_2_OR_NEWER - - /// This CancellationToken is canceled when the MonoBehaviour will be destroyed. - public static CancellationToken GetCancellationTokenOnDestroy(this MonoBehaviour monoBehaviour) - { - return monoBehaviour.destroyCancellationToken; - } - -#endif - - /// This CancellationToken is canceled when the MonoBehaviour will be destroyed. - public static CancellationToken GetCancellationTokenOnDestroy(this GameObject gameObject) - { - return gameObject.GetAsyncDestroyTrigger().CancellationToken; - } - - /// This CancellationToken is canceled when the MonoBehaviour will be destroyed. - public static CancellationToken GetCancellationTokenOnDestroy(this Component component) - { -#if UNITY_2022_2_OR_NEWER - if (component is MonoBehaviour mb) - { - return mb.destroyCancellationToken; - } -#endif - - return component.GetAsyncDestroyTrigger().CancellationToken; - } - } -} - -namespace VirtueSky.Threading.Tasks.Triggers -{ - public static partial class AsyncTriggerExtensions - { - // Util. - - static T GetOrAddComponent(GameObject gameObject) - where T : Component - { -#if UNITY_2019_2_OR_NEWER - if (!gameObject.TryGetComponent(out var component)) - { - component = gameObject.AddComponent(); - } -#else - var component = gameObject.GetComponent(); - if (component == null) - { - component = gameObject.AddComponent(); - } -#endif - - return component; - } - - // Special for single operation. - - /// This function is called when the MonoBehaviour will be destroyed. - public static UniTask OnDestroyAsync(this GameObject gameObject) - { - return gameObject.GetAsyncDestroyTrigger().OnDestroyAsync(); - } - - /// This function is called when the MonoBehaviour will be destroyed. - public static UniTask OnDestroyAsync(this Component component) - { - return component.GetAsyncDestroyTrigger().OnDestroyAsync(); - } - - public static UniTask StartAsync(this GameObject gameObject) - { - return gameObject.GetAsyncStartTrigger().StartAsync(); - } - - public static UniTask StartAsync(this Component component) - { - return component.GetAsyncStartTrigger().StartAsync(); - } - - public static UniTask AwakeAsync(this GameObject gameObject) - { - return gameObject.GetAsyncAwakeTrigger().AwakeAsync(); - } - - public static UniTask AwakeAsync(this Component component) - { - return component.GetAsyncAwakeTrigger().AwakeAsync(); - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/Triggers/AsyncTriggerExtensions.cs.meta b/VirtueSky/UniTask/Runtime/Triggers/AsyncTriggerExtensions.cs.meta deleted file mode 100644 index 348783dd..00000000 --- a/VirtueSky/UniTask/Runtime/Triggers/AsyncTriggerExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 59b61dbea1562a84fb7a38ae0a0a0f88 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/Triggers/MonoBehaviourMessagesTriggers.cs b/VirtueSky/UniTask/Runtime/Triggers/MonoBehaviourMessagesTriggers.cs deleted file mode 100644 index 0e840b17..00000000 --- a/VirtueSky/UniTask/Runtime/Triggers/MonoBehaviourMessagesTriggers.cs +++ /dev/null @@ -1,4457 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System.Threading; -using UnityEngine; -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT -using UnityEngine.EventSystems; -#endif - -namespace VirtueSky.Threading.Tasks.Triggers -{ -#region FixedUpdate - - public interface IAsyncFixedUpdateHandler - { - UniTask FixedUpdateAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncFixedUpdateHandler - { - UniTask IAsyncFixedUpdateHandler.FixedUpdateAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncFixedUpdateTrigger GetAsyncFixedUpdateTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncFixedUpdateTrigger GetAsyncFixedUpdateTrigger(this Component component) - { - return component.gameObject.GetAsyncFixedUpdateTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncFixedUpdateTrigger : AsyncTriggerBase - { - void FixedUpdate() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncFixedUpdateHandler GetFixedUpdateAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncFixedUpdateHandler GetFixedUpdateAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask FixedUpdateAsync() - { - return ((IAsyncFixedUpdateHandler)new AsyncTriggerHandler(this, true)).FixedUpdateAsync(); - } - - public UniTask FixedUpdateAsync(CancellationToken cancellationToken) - { - return ((IAsyncFixedUpdateHandler)new AsyncTriggerHandler(this, cancellationToken, true)).FixedUpdateAsync(); - } - } -#endregion - -#region LateUpdate - - public interface IAsyncLateUpdateHandler - { - UniTask LateUpdateAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncLateUpdateHandler - { - UniTask IAsyncLateUpdateHandler.LateUpdateAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncLateUpdateTrigger GetAsyncLateUpdateTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncLateUpdateTrigger GetAsyncLateUpdateTrigger(this Component component) - { - return component.gameObject.GetAsyncLateUpdateTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncLateUpdateTrigger : AsyncTriggerBase - { - void LateUpdate() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncLateUpdateHandler GetLateUpdateAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncLateUpdateHandler GetLateUpdateAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask LateUpdateAsync() - { - return ((IAsyncLateUpdateHandler)new AsyncTriggerHandler(this, true)).LateUpdateAsync(); - } - - public UniTask LateUpdateAsync(CancellationToken cancellationToken) - { - return ((IAsyncLateUpdateHandler)new AsyncTriggerHandler(this, cancellationToken, true)).LateUpdateAsync(); - } - } -#endregion - -#region AnimatorIK - - public interface IAsyncOnAnimatorIKHandler - { - UniTask OnAnimatorIKAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnAnimatorIKHandler - { - UniTask IAsyncOnAnimatorIKHandler.OnAnimatorIKAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncAnimatorIKTrigger GetAsyncAnimatorIKTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncAnimatorIKTrigger GetAsyncAnimatorIKTrigger(this Component component) - { - return component.gameObject.GetAsyncAnimatorIKTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncAnimatorIKTrigger : AsyncTriggerBase - { - void OnAnimatorIK(int layerIndex) - { - RaiseEvent((layerIndex)); - } - - public IAsyncOnAnimatorIKHandler GetOnAnimatorIKAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnAnimatorIKHandler GetOnAnimatorIKAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnAnimatorIKAsync() - { - return ((IAsyncOnAnimatorIKHandler)new AsyncTriggerHandler(this, true)).OnAnimatorIKAsync(); - } - - public UniTask OnAnimatorIKAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnAnimatorIKHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnAnimatorIKAsync(); - } - } -#endregion - -#region AnimatorMove - - public interface IAsyncOnAnimatorMoveHandler - { - UniTask OnAnimatorMoveAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnAnimatorMoveHandler - { - UniTask IAsyncOnAnimatorMoveHandler.OnAnimatorMoveAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncAnimatorMoveTrigger GetAsyncAnimatorMoveTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncAnimatorMoveTrigger GetAsyncAnimatorMoveTrigger(this Component component) - { - return component.gameObject.GetAsyncAnimatorMoveTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncAnimatorMoveTrigger : AsyncTriggerBase - { - void OnAnimatorMove() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnAnimatorMoveHandler GetOnAnimatorMoveAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnAnimatorMoveHandler GetOnAnimatorMoveAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnAnimatorMoveAsync() - { - return ((IAsyncOnAnimatorMoveHandler)new AsyncTriggerHandler(this, true)).OnAnimatorMoveAsync(); - } - - public UniTask OnAnimatorMoveAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnAnimatorMoveHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnAnimatorMoveAsync(); - } - } -#endregion - -#region ApplicationFocus - - public interface IAsyncOnApplicationFocusHandler - { - UniTask OnApplicationFocusAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnApplicationFocusHandler - { - UniTask IAsyncOnApplicationFocusHandler.OnApplicationFocusAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncApplicationFocusTrigger GetAsyncApplicationFocusTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncApplicationFocusTrigger GetAsyncApplicationFocusTrigger(this Component component) - { - return component.gameObject.GetAsyncApplicationFocusTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncApplicationFocusTrigger : AsyncTriggerBase - { - void OnApplicationFocus(bool hasFocus) - { - RaiseEvent((hasFocus)); - } - - public IAsyncOnApplicationFocusHandler GetOnApplicationFocusAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnApplicationFocusHandler GetOnApplicationFocusAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnApplicationFocusAsync() - { - return ((IAsyncOnApplicationFocusHandler)new AsyncTriggerHandler(this, true)).OnApplicationFocusAsync(); - } - - public UniTask OnApplicationFocusAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnApplicationFocusHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnApplicationFocusAsync(); - } - } -#endregion - -#region ApplicationPause - - public interface IAsyncOnApplicationPauseHandler - { - UniTask OnApplicationPauseAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnApplicationPauseHandler - { - UniTask IAsyncOnApplicationPauseHandler.OnApplicationPauseAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncApplicationPauseTrigger GetAsyncApplicationPauseTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncApplicationPauseTrigger GetAsyncApplicationPauseTrigger(this Component component) - { - return component.gameObject.GetAsyncApplicationPauseTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncApplicationPauseTrigger : AsyncTriggerBase - { - void OnApplicationPause(bool pauseStatus) - { - RaiseEvent((pauseStatus)); - } - - public IAsyncOnApplicationPauseHandler GetOnApplicationPauseAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnApplicationPauseHandler GetOnApplicationPauseAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnApplicationPauseAsync() - { - return ((IAsyncOnApplicationPauseHandler)new AsyncTriggerHandler(this, true)).OnApplicationPauseAsync(); - } - - public UniTask OnApplicationPauseAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnApplicationPauseHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnApplicationPauseAsync(); - } - } -#endregion - -#region ApplicationQuit - - public interface IAsyncOnApplicationQuitHandler - { - UniTask OnApplicationQuitAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnApplicationQuitHandler - { - UniTask IAsyncOnApplicationQuitHandler.OnApplicationQuitAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncApplicationQuitTrigger GetAsyncApplicationQuitTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncApplicationQuitTrigger GetAsyncApplicationQuitTrigger(this Component component) - { - return component.gameObject.GetAsyncApplicationQuitTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncApplicationQuitTrigger : AsyncTriggerBase - { - void OnApplicationQuit() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnApplicationQuitHandler GetOnApplicationQuitAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnApplicationQuitHandler GetOnApplicationQuitAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnApplicationQuitAsync() - { - return ((IAsyncOnApplicationQuitHandler)new AsyncTriggerHandler(this, true)).OnApplicationQuitAsync(); - } - - public UniTask OnApplicationQuitAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnApplicationQuitHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnApplicationQuitAsync(); - } - } -#endregion - -#region AudioFilterRead - - public interface IAsyncOnAudioFilterReadHandler - { - UniTask<(float[] data, int channels)> OnAudioFilterReadAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnAudioFilterReadHandler - { - UniTask<(float[] data, int channels)> IAsyncOnAudioFilterReadHandler.OnAudioFilterReadAsync() - { - core.Reset(); - return new UniTask<(float[] data, int channels)>((IUniTaskSource<(float[] data, int channels)>)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncAudioFilterReadTrigger GetAsyncAudioFilterReadTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncAudioFilterReadTrigger GetAsyncAudioFilterReadTrigger(this Component component) - { - return component.gameObject.GetAsyncAudioFilterReadTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncAudioFilterReadTrigger : AsyncTriggerBase<(float[] data, int channels)> - { - void OnAudioFilterRead(float[] data, int channels) - { - RaiseEvent((data, channels)); - } - - public IAsyncOnAudioFilterReadHandler GetOnAudioFilterReadAsyncHandler() - { - return new AsyncTriggerHandler<(float[] data, int channels)>(this, false); - } - - public IAsyncOnAudioFilterReadHandler GetOnAudioFilterReadAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler<(float[] data, int channels)>(this, cancellationToken, false); - } - - public UniTask<(float[] data, int channels)> OnAudioFilterReadAsync() - { - return ((IAsyncOnAudioFilterReadHandler)new AsyncTriggerHandler<(float[] data, int channels)>(this, true)).OnAudioFilterReadAsync(); - } - - public UniTask<(float[] data, int channels)> OnAudioFilterReadAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnAudioFilterReadHandler)new AsyncTriggerHandler<(float[] data, int channels)>(this, cancellationToken, true)).OnAudioFilterReadAsync(); - } - } -#endregion - -#region BecameInvisible - - public interface IAsyncOnBecameInvisibleHandler - { - UniTask OnBecameInvisibleAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnBecameInvisibleHandler - { - UniTask IAsyncOnBecameInvisibleHandler.OnBecameInvisibleAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncBecameInvisibleTrigger GetAsyncBecameInvisibleTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncBecameInvisibleTrigger GetAsyncBecameInvisibleTrigger(this Component component) - { - return component.gameObject.GetAsyncBecameInvisibleTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncBecameInvisibleTrigger : AsyncTriggerBase - { - void OnBecameInvisible() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnBecameInvisibleHandler GetOnBecameInvisibleAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnBecameInvisibleHandler GetOnBecameInvisibleAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnBecameInvisibleAsync() - { - return ((IAsyncOnBecameInvisibleHandler)new AsyncTriggerHandler(this, true)).OnBecameInvisibleAsync(); - } - - public UniTask OnBecameInvisibleAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnBecameInvisibleHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnBecameInvisibleAsync(); - } - } -#endregion - -#region BecameVisible - - public interface IAsyncOnBecameVisibleHandler - { - UniTask OnBecameVisibleAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnBecameVisibleHandler - { - UniTask IAsyncOnBecameVisibleHandler.OnBecameVisibleAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncBecameVisibleTrigger GetAsyncBecameVisibleTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncBecameVisibleTrigger GetAsyncBecameVisibleTrigger(this Component component) - { - return component.gameObject.GetAsyncBecameVisibleTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncBecameVisibleTrigger : AsyncTriggerBase - { - void OnBecameVisible() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnBecameVisibleHandler GetOnBecameVisibleAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnBecameVisibleHandler GetOnBecameVisibleAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnBecameVisibleAsync() - { - return ((IAsyncOnBecameVisibleHandler)new AsyncTriggerHandler(this, true)).OnBecameVisibleAsync(); - } - - public UniTask OnBecameVisibleAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnBecameVisibleHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnBecameVisibleAsync(); - } - } -#endregion - -#region BeforeTransformParentChanged - - public interface IAsyncOnBeforeTransformParentChangedHandler - { - UniTask OnBeforeTransformParentChangedAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnBeforeTransformParentChangedHandler - { - UniTask IAsyncOnBeforeTransformParentChangedHandler.OnBeforeTransformParentChangedAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncBeforeTransformParentChangedTrigger GetAsyncBeforeTransformParentChangedTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncBeforeTransformParentChangedTrigger GetAsyncBeforeTransformParentChangedTrigger(this Component component) - { - return component.gameObject.GetAsyncBeforeTransformParentChangedTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncBeforeTransformParentChangedTrigger : AsyncTriggerBase - { - void OnBeforeTransformParentChanged() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnBeforeTransformParentChangedHandler GetOnBeforeTransformParentChangedAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnBeforeTransformParentChangedHandler GetOnBeforeTransformParentChangedAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnBeforeTransformParentChangedAsync() - { - return ((IAsyncOnBeforeTransformParentChangedHandler)new AsyncTriggerHandler(this, true)).OnBeforeTransformParentChangedAsync(); - } - - public UniTask OnBeforeTransformParentChangedAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnBeforeTransformParentChangedHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnBeforeTransformParentChangedAsync(); - } - } -#endregion - -#region OnCanvasGroupChanged - - public interface IAsyncOnCanvasGroupChangedHandler - { - UniTask OnCanvasGroupChangedAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnCanvasGroupChangedHandler - { - UniTask IAsyncOnCanvasGroupChangedHandler.OnCanvasGroupChangedAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncOnCanvasGroupChangedTrigger GetAsyncOnCanvasGroupChangedTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncOnCanvasGroupChangedTrigger GetAsyncOnCanvasGroupChangedTrigger(this Component component) - { - return component.gameObject.GetAsyncOnCanvasGroupChangedTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncOnCanvasGroupChangedTrigger : AsyncTriggerBase - { - void OnCanvasGroupChanged() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnCanvasGroupChangedHandler GetOnCanvasGroupChangedAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnCanvasGroupChangedHandler GetOnCanvasGroupChangedAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnCanvasGroupChangedAsync() - { - return ((IAsyncOnCanvasGroupChangedHandler)new AsyncTriggerHandler(this, true)).OnCanvasGroupChangedAsync(); - } - - public UniTask OnCanvasGroupChangedAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnCanvasGroupChangedHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnCanvasGroupChangedAsync(); - } - } -#endregion - -#region CollisionEnter -#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS_SUPPORT - - public interface IAsyncOnCollisionEnterHandler - { - UniTask OnCollisionEnterAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnCollisionEnterHandler - { - UniTask IAsyncOnCollisionEnterHandler.OnCollisionEnterAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncCollisionEnterTrigger GetAsyncCollisionEnterTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncCollisionEnterTrigger GetAsyncCollisionEnterTrigger(this Component component) - { - return component.gameObject.GetAsyncCollisionEnterTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncCollisionEnterTrigger : AsyncTriggerBase - { - void OnCollisionEnter(Collision coll) - { - RaiseEvent((coll)); - } - - public IAsyncOnCollisionEnterHandler GetOnCollisionEnterAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnCollisionEnterHandler GetOnCollisionEnterAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnCollisionEnterAsync() - { - return ((IAsyncOnCollisionEnterHandler)new AsyncTriggerHandler(this, true)).OnCollisionEnterAsync(); - } - - public UniTask OnCollisionEnterAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnCollisionEnterHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnCollisionEnterAsync(); - } - } -#endif -#endregion - -#region CollisionEnter2D -#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS2D_SUPPORT - - public interface IAsyncOnCollisionEnter2DHandler - { - UniTask OnCollisionEnter2DAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnCollisionEnter2DHandler - { - UniTask IAsyncOnCollisionEnter2DHandler.OnCollisionEnter2DAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncCollisionEnter2DTrigger GetAsyncCollisionEnter2DTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncCollisionEnter2DTrigger GetAsyncCollisionEnter2DTrigger(this Component component) - { - return component.gameObject.GetAsyncCollisionEnter2DTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncCollisionEnter2DTrigger : AsyncTriggerBase - { - void OnCollisionEnter2D(Collision2D coll) - { - RaiseEvent((coll)); - } - - public IAsyncOnCollisionEnter2DHandler GetOnCollisionEnter2DAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnCollisionEnter2DHandler GetOnCollisionEnter2DAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnCollisionEnter2DAsync() - { - return ((IAsyncOnCollisionEnter2DHandler)new AsyncTriggerHandler(this, true)).OnCollisionEnter2DAsync(); - } - - public UniTask OnCollisionEnter2DAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnCollisionEnter2DHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnCollisionEnter2DAsync(); - } - } -#endif -#endregion - -#region CollisionExit -#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS_SUPPORT - - public interface IAsyncOnCollisionExitHandler - { - UniTask OnCollisionExitAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnCollisionExitHandler - { - UniTask IAsyncOnCollisionExitHandler.OnCollisionExitAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncCollisionExitTrigger GetAsyncCollisionExitTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncCollisionExitTrigger GetAsyncCollisionExitTrigger(this Component component) - { - return component.gameObject.GetAsyncCollisionExitTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncCollisionExitTrigger : AsyncTriggerBase - { - void OnCollisionExit(Collision coll) - { - RaiseEvent((coll)); - } - - public IAsyncOnCollisionExitHandler GetOnCollisionExitAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnCollisionExitHandler GetOnCollisionExitAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnCollisionExitAsync() - { - return ((IAsyncOnCollisionExitHandler)new AsyncTriggerHandler(this, true)).OnCollisionExitAsync(); - } - - public UniTask OnCollisionExitAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnCollisionExitHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnCollisionExitAsync(); - } - } -#endif -#endregion - -#region CollisionExit2D -#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS2D_SUPPORT - - public interface IAsyncOnCollisionExit2DHandler - { - UniTask OnCollisionExit2DAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnCollisionExit2DHandler - { - UniTask IAsyncOnCollisionExit2DHandler.OnCollisionExit2DAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncCollisionExit2DTrigger GetAsyncCollisionExit2DTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncCollisionExit2DTrigger GetAsyncCollisionExit2DTrigger(this Component component) - { - return component.gameObject.GetAsyncCollisionExit2DTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncCollisionExit2DTrigger : AsyncTriggerBase - { - void OnCollisionExit2D(Collision2D coll) - { - RaiseEvent((coll)); - } - - public IAsyncOnCollisionExit2DHandler GetOnCollisionExit2DAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnCollisionExit2DHandler GetOnCollisionExit2DAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnCollisionExit2DAsync() - { - return ((IAsyncOnCollisionExit2DHandler)new AsyncTriggerHandler(this, true)).OnCollisionExit2DAsync(); - } - - public UniTask OnCollisionExit2DAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnCollisionExit2DHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnCollisionExit2DAsync(); - } - } -#endif -#endregion - -#region CollisionStay -#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS_SUPPORT - - public interface IAsyncOnCollisionStayHandler - { - UniTask OnCollisionStayAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnCollisionStayHandler - { - UniTask IAsyncOnCollisionStayHandler.OnCollisionStayAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncCollisionStayTrigger GetAsyncCollisionStayTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncCollisionStayTrigger GetAsyncCollisionStayTrigger(this Component component) - { - return component.gameObject.GetAsyncCollisionStayTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncCollisionStayTrigger : AsyncTriggerBase - { - void OnCollisionStay(Collision coll) - { - RaiseEvent((coll)); - } - - public IAsyncOnCollisionStayHandler GetOnCollisionStayAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnCollisionStayHandler GetOnCollisionStayAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnCollisionStayAsync() - { - return ((IAsyncOnCollisionStayHandler)new AsyncTriggerHandler(this, true)).OnCollisionStayAsync(); - } - - public UniTask OnCollisionStayAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnCollisionStayHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnCollisionStayAsync(); - } - } -#endif -#endregion - -#region CollisionStay2D -#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS2D_SUPPORT - - public interface IAsyncOnCollisionStay2DHandler - { - UniTask OnCollisionStay2DAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnCollisionStay2DHandler - { - UniTask IAsyncOnCollisionStay2DHandler.OnCollisionStay2DAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncCollisionStay2DTrigger GetAsyncCollisionStay2DTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncCollisionStay2DTrigger GetAsyncCollisionStay2DTrigger(this Component component) - { - return component.gameObject.GetAsyncCollisionStay2DTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncCollisionStay2DTrigger : AsyncTriggerBase - { - void OnCollisionStay2D(Collision2D coll) - { - RaiseEvent((coll)); - } - - public IAsyncOnCollisionStay2DHandler GetOnCollisionStay2DAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnCollisionStay2DHandler GetOnCollisionStay2DAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnCollisionStay2DAsync() - { - return ((IAsyncOnCollisionStay2DHandler)new AsyncTriggerHandler(this, true)).OnCollisionStay2DAsync(); - } - - public UniTask OnCollisionStay2DAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnCollisionStay2DHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnCollisionStay2DAsync(); - } - } -#endif -#endregion - -#region ControllerColliderHit -#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS_SUPPORT - - public interface IAsyncOnControllerColliderHitHandler - { - UniTask OnControllerColliderHitAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnControllerColliderHitHandler - { - UniTask IAsyncOnControllerColliderHitHandler.OnControllerColliderHitAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncControllerColliderHitTrigger GetAsyncControllerColliderHitTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncControllerColliderHitTrigger GetAsyncControllerColliderHitTrigger(this Component component) - { - return component.gameObject.GetAsyncControllerColliderHitTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncControllerColliderHitTrigger : AsyncTriggerBase - { - void OnControllerColliderHit(ControllerColliderHit hit) - { - RaiseEvent((hit)); - } - - public IAsyncOnControllerColliderHitHandler GetOnControllerColliderHitAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnControllerColliderHitHandler GetOnControllerColliderHitAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnControllerColliderHitAsync() - { - return ((IAsyncOnControllerColliderHitHandler)new AsyncTriggerHandler(this, true)).OnControllerColliderHitAsync(); - } - - public UniTask OnControllerColliderHitAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnControllerColliderHitHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnControllerColliderHitAsync(); - } - } -#endif -#endregion - -#region Disable - - public interface IAsyncOnDisableHandler - { - UniTask OnDisableAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnDisableHandler - { - UniTask IAsyncOnDisableHandler.OnDisableAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncDisableTrigger GetAsyncDisableTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncDisableTrigger GetAsyncDisableTrigger(this Component component) - { - return component.gameObject.GetAsyncDisableTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncDisableTrigger : AsyncTriggerBase - { - void OnDisable() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnDisableHandler GetOnDisableAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnDisableHandler GetOnDisableAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnDisableAsync() - { - return ((IAsyncOnDisableHandler)new AsyncTriggerHandler(this, true)).OnDisableAsync(); - } - - public UniTask OnDisableAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnDisableHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnDisableAsync(); - } - } -#endregion - -#region DrawGizmos - - public interface IAsyncOnDrawGizmosHandler - { - UniTask OnDrawGizmosAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnDrawGizmosHandler - { - UniTask IAsyncOnDrawGizmosHandler.OnDrawGizmosAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncDrawGizmosTrigger GetAsyncDrawGizmosTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncDrawGizmosTrigger GetAsyncDrawGizmosTrigger(this Component component) - { - return component.gameObject.GetAsyncDrawGizmosTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncDrawGizmosTrigger : AsyncTriggerBase - { - void OnDrawGizmos() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnDrawGizmosHandler GetOnDrawGizmosAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnDrawGizmosHandler GetOnDrawGizmosAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnDrawGizmosAsync() - { - return ((IAsyncOnDrawGizmosHandler)new AsyncTriggerHandler(this, true)).OnDrawGizmosAsync(); - } - - public UniTask OnDrawGizmosAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnDrawGizmosHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnDrawGizmosAsync(); - } - } -#endregion - -#region DrawGizmosSelected - - public interface IAsyncOnDrawGizmosSelectedHandler - { - UniTask OnDrawGizmosSelectedAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnDrawGizmosSelectedHandler - { - UniTask IAsyncOnDrawGizmosSelectedHandler.OnDrawGizmosSelectedAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncDrawGizmosSelectedTrigger GetAsyncDrawGizmosSelectedTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncDrawGizmosSelectedTrigger GetAsyncDrawGizmosSelectedTrigger(this Component component) - { - return component.gameObject.GetAsyncDrawGizmosSelectedTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncDrawGizmosSelectedTrigger : AsyncTriggerBase - { - void OnDrawGizmosSelected() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnDrawGizmosSelectedHandler GetOnDrawGizmosSelectedAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnDrawGizmosSelectedHandler GetOnDrawGizmosSelectedAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnDrawGizmosSelectedAsync() - { - return ((IAsyncOnDrawGizmosSelectedHandler)new AsyncTriggerHandler(this, true)).OnDrawGizmosSelectedAsync(); - } - - public UniTask OnDrawGizmosSelectedAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnDrawGizmosSelectedHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnDrawGizmosSelectedAsync(); - } - } -#endregion - -#region Enable - - public interface IAsyncOnEnableHandler - { - UniTask OnEnableAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnEnableHandler - { - UniTask IAsyncOnEnableHandler.OnEnableAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncEnableTrigger GetAsyncEnableTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncEnableTrigger GetAsyncEnableTrigger(this Component component) - { - return component.gameObject.GetAsyncEnableTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncEnableTrigger : AsyncTriggerBase - { - void OnEnable() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnEnableHandler GetOnEnableAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnEnableHandler GetOnEnableAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnEnableAsync() - { - return ((IAsyncOnEnableHandler)new AsyncTriggerHandler(this, true)).OnEnableAsync(); - } - - public UniTask OnEnableAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnEnableHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnEnableAsync(); - } - } -#endregion - -#region GUI - - public interface IAsyncOnGUIHandler - { - UniTask OnGUIAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnGUIHandler - { - UniTask IAsyncOnGUIHandler.OnGUIAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncGUITrigger GetAsyncGUITrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncGUITrigger GetAsyncGUITrigger(this Component component) - { - return component.gameObject.GetAsyncGUITrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncGUITrigger : AsyncTriggerBase - { - void OnGUI() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnGUIHandler GetOnGUIAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnGUIHandler GetOnGUIAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnGUIAsync() - { - return ((IAsyncOnGUIHandler)new AsyncTriggerHandler(this, true)).OnGUIAsync(); - } - - public UniTask OnGUIAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnGUIHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnGUIAsync(); - } - } -#endregion - -#region JointBreak -#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS_SUPPORT - - public interface IAsyncOnJointBreakHandler - { - UniTask OnJointBreakAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnJointBreakHandler - { - UniTask IAsyncOnJointBreakHandler.OnJointBreakAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncJointBreakTrigger GetAsyncJointBreakTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncJointBreakTrigger GetAsyncJointBreakTrigger(this Component component) - { - return component.gameObject.GetAsyncJointBreakTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncJointBreakTrigger : AsyncTriggerBase - { - void OnJointBreak(float breakForce) - { - RaiseEvent((breakForce)); - } - - public IAsyncOnJointBreakHandler GetOnJointBreakAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnJointBreakHandler GetOnJointBreakAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnJointBreakAsync() - { - return ((IAsyncOnJointBreakHandler)new AsyncTriggerHandler(this, true)).OnJointBreakAsync(); - } - - public UniTask OnJointBreakAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnJointBreakHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnJointBreakAsync(); - } - } -#endif -#endregion - -#region JointBreak2D -#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS2D_SUPPORT - - public interface IAsyncOnJointBreak2DHandler - { - UniTask OnJointBreak2DAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnJointBreak2DHandler - { - UniTask IAsyncOnJointBreak2DHandler.OnJointBreak2DAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncJointBreak2DTrigger GetAsyncJointBreak2DTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncJointBreak2DTrigger GetAsyncJointBreak2DTrigger(this Component component) - { - return component.gameObject.GetAsyncJointBreak2DTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncJointBreak2DTrigger : AsyncTriggerBase - { - void OnJointBreak2D(Joint2D brokenJoint) - { - RaiseEvent((brokenJoint)); - } - - public IAsyncOnJointBreak2DHandler GetOnJointBreak2DAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnJointBreak2DHandler GetOnJointBreak2DAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnJointBreak2DAsync() - { - return ((IAsyncOnJointBreak2DHandler)new AsyncTriggerHandler(this, true)).OnJointBreak2DAsync(); - } - - public UniTask OnJointBreak2DAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnJointBreak2DHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnJointBreak2DAsync(); - } - } -#endif -#endregion - -#region MouseDown -#if !(UNITY_IPHONE || UNITY_ANDROID || UNITY_METRO) - - public interface IAsyncOnMouseDownHandler - { - UniTask OnMouseDownAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnMouseDownHandler - { - UniTask IAsyncOnMouseDownHandler.OnMouseDownAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncMouseDownTrigger GetAsyncMouseDownTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncMouseDownTrigger GetAsyncMouseDownTrigger(this Component component) - { - return component.gameObject.GetAsyncMouseDownTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncMouseDownTrigger : AsyncTriggerBase - { - void OnMouseDown() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnMouseDownHandler GetOnMouseDownAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnMouseDownHandler GetOnMouseDownAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnMouseDownAsync() - { - return ((IAsyncOnMouseDownHandler)new AsyncTriggerHandler(this, true)).OnMouseDownAsync(); - } - - public UniTask OnMouseDownAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnMouseDownHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnMouseDownAsync(); - } - } -#endif -#endregion - -#region MouseDrag -#if !(UNITY_IPHONE || UNITY_ANDROID || UNITY_METRO) - - public interface IAsyncOnMouseDragHandler - { - UniTask OnMouseDragAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnMouseDragHandler - { - UniTask IAsyncOnMouseDragHandler.OnMouseDragAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncMouseDragTrigger GetAsyncMouseDragTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncMouseDragTrigger GetAsyncMouseDragTrigger(this Component component) - { - return component.gameObject.GetAsyncMouseDragTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncMouseDragTrigger : AsyncTriggerBase - { - void OnMouseDrag() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnMouseDragHandler GetOnMouseDragAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnMouseDragHandler GetOnMouseDragAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnMouseDragAsync() - { - return ((IAsyncOnMouseDragHandler)new AsyncTriggerHandler(this, true)).OnMouseDragAsync(); - } - - public UniTask OnMouseDragAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnMouseDragHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnMouseDragAsync(); - } - } -#endif -#endregion - -#region MouseEnter -#if !(UNITY_IPHONE || UNITY_ANDROID || UNITY_METRO) - - public interface IAsyncOnMouseEnterHandler - { - UniTask OnMouseEnterAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnMouseEnterHandler - { - UniTask IAsyncOnMouseEnterHandler.OnMouseEnterAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncMouseEnterTrigger GetAsyncMouseEnterTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncMouseEnterTrigger GetAsyncMouseEnterTrigger(this Component component) - { - return component.gameObject.GetAsyncMouseEnterTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncMouseEnterTrigger : AsyncTriggerBase - { - void OnMouseEnter() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnMouseEnterHandler GetOnMouseEnterAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnMouseEnterHandler GetOnMouseEnterAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnMouseEnterAsync() - { - return ((IAsyncOnMouseEnterHandler)new AsyncTriggerHandler(this, true)).OnMouseEnterAsync(); - } - - public UniTask OnMouseEnterAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnMouseEnterHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnMouseEnterAsync(); - } - } -#endif -#endregion - -#region MouseExit -#if !(UNITY_IPHONE || UNITY_ANDROID || UNITY_METRO) - - public interface IAsyncOnMouseExitHandler - { - UniTask OnMouseExitAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnMouseExitHandler - { - UniTask IAsyncOnMouseExitHandler.OnMouseExitAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncMouseExitTrigger GetAsyncMouseExitTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncMouseExitTrigger GetAsyncMouseExitTrigger(this Component component) - { - return component.gameObject.GetAsyncMouseExitTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncMouseExitTrigger : AsyncTriggerBase - { - void OnMouseExit() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnMouseExitHandler GetOnMouseExitAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnMouseExitHandler GetOnMouseExitAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnMouseExitAsync() - { - return ((IAsyncOnMouseExitHandler)new AsyncTriggerHandler(this, true)).OnMouseExitAsync(); - } - - public UniTask OnMouseExitAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnMouseExitHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnMouseExitAsync(); - } - } -#endif -#endregion - -#region MouseOver -#if !(UNITY_IPHONE || UNITY_ANDROID || UNITY_METRO) - - public interface IAsyncOnMouseOverHandler - { - UniTask OnMouseOverAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnMouseOverHandler - { - UniTask IAsyncOnMouseOverHandler.OnMouseOverAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncMouseOverTrigger GetAsyncMouseOverTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncMouseOverTrigger GetAsyncMouseOverTrigger(this Component component) - { - return component.gameObject.GetAsyncMouseOverTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncMouseOverTrigger : AsyncTriggerBase - { - void OnMouseOver() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnMouseOverHandler GetOnMouseOverAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnMouseOverHandler GetOnMouseOverAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnMouseOverAsync() - { - return ((IAsyncOnMouseOverHandler)new AsyncTriggerHandler(this, true)).OnMouseOverAsync(); - } - - public UniTask OnMouseOverAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnMouseOverHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnMouseOverAsync(); - } - } -#endif -#endregion - -#region MouseUp -#if !(UNITY_IPHONE || UNITY_ANDROID || UNITY_METRO) - - public interface IAsyncOnMouseUpHandler - { - UniTask OnMouseUpAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnMouseUpHandler - { - UniTask IAsyncOnMouseUpHandler.OnMouseUpAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncMouseUpTrigger GetAsyncMouseUpTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncMouseUpTrigger GetAsyncMouseUpTrigger(this Component component) - { - return component.gameObject.GetAsyncMouseUpTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncMouseUpTrigger : AsyncTriggerBase - { - void OnMouseUp() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnMouseUpHandler GetOnMouseUpAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnMouseUpHandler GetOnMouseUpAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnMouseUpAsync() - { - return ((IAsyncOnMouseUpHandler)new AsyncTriggerHandler(this, true)).OnMouseUpAsync(); - } - - public UniTask OnMouseUpAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnMouseUpHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnMouseUpAsync(); - } - } -#endif -#endregion - -#region MouseUpAsButton -#if !(UNITY_IPHONE || UNITY_ANDROID || UNITY_METRO) - - public interface IAsyncOnMouseUpAsButtonHandler - { - UniTask OnMouseUpAsButtonAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnMouseUpAsButtonHandler - { - UniTask IAsyncOnMouseUpAsButtonHandler.OnMouseUpAsButtonAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncMouseUpAsButtonTrigger GetAsyncMouseUpAsButtonTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncMouseUpAsButtonTrigger GetAsyncMouseUpAsButtonTrigger(this Component component) - { - return component.gameObject.GetAsyncMouseUpAsButtonTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncMouseUpAsButtonTrigger : AsyncTriggerBase - { - void OnMouseUpAsButton() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnMouseUpAsButtonHandler GetOnMouseUpAsButtonAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnMouseUpAsButtonHandler GetOnMouseUpAsButtonAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnMouseUpAsButtonAsync() - { - return ((IAsyncOnMouseUpAsButtonHandler)new AsyncTriggerHandler(this, true)).OnMouseUpAsButtonAsync(); - } - - public UniTask OnMouseUpAsButtonAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnMouseUpAsButtonHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnMouseUpAsButtonAsync(); - } - } -#endif -#endregion - -#region ParticleCollision - - public interface IAsyncOnParticleCollisionHandler - { - UniTask OnParticleCollisionAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnParticleCollisionHandler - { - UniTask IAsyncOnParticleCollisionHandler.OnParticleCollisionAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncParticleCollisionTrigger GetAsyncParticleCollisionTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncParticleCollisionTrigger GetAsyncParticleCollisionTrigger(this Component component) - { - return component.gameObject.GetAsyncParticleCollisionTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncParticleCollisionTrigger : AsyncTriggerBase - { - void OnParticleCollision(GameObject other) - { - RaiseEvent((other)); - } - - public IAsyncOnParticleCollisionHandler GetOnParticleCollisionAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnParticleCollisionHandler GetOnParticleCollisionAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnParticleCollisionAsync() - { - return ((IAsyncOnParticleCollisionHandler)new AsyncTriggerHandler(this, true)).OnParticleCollisionAsync(); - } - - public UniTask OnParticleCollisionAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnParticleCollisionHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnParticleCollisionAsync(); - } - } -#endregion - -#region ParticleSystemStopped - - public interface IAsyncOnParticleSystemStoppedHandler - { - UniTask OnParticleSystemStoppedAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnParticleSystemStoppedHandler - { - UniTask IAsyncOnParticleSystemStoppedHandler.OnParticleSystemStoppedAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncParticleSystemStoppedTrigger GetAsyncParticleSystemStoppedTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncParticleSystemStoppedTrigger GetAsyncParticleSystemStoppedTrigger(this Component component) - { - return component.gameObject.GetAsyncParticleSystemStoppedTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncParticleSystemStoppedTrigger : AsyncTriggerBase - { - void OnParticleSystemStopped() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnParticleSystemStoppedHandler GetOnParticleSystemStoppedAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnParticleSystemStoppedHandler GetOnParticleSystemStoppedAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnParticleSystemStoppedAsync() - { - return ((IAsyncOnParticleSystemStoppedHandler)new AsyncTriggerHandler(this, true)).OnParticleSystemStoppedAsync(); - } - - public UniTask OnParticleSystemStoppedAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnParticleSystemStoppedHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnParticleSystemStoppedAsync(); - } - } -#endregion - -#region ParticleTrigger - - public interface IAsyncOnParticleTriggerHandler - { - UniTask OnParticleTriggerAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnParticleTriggerHandler - { - UniTask IAsyncOnParticleTriggerHandler.OnParticleTriggerAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncParticleTriggerTrigger GetAsyncParticleTriggerTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncParticleTriggerTrigger GetAsyncParticleTriggerTrigger(this Component component) - { - return component.gameObject.GetAsyncParticleTriggerTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncParticleTriggerTrigger : AsyncTriggerBase - { - void OnParticleTrigger() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnParticleTriggerHandler GetOnParticleTriggerAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnParticleTriggerHandler GetOnParticleTriggerAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnParticleTriggerAsync() - { - return ((IAsyncOnParticleTriggerHandler)new AsyncTriggerHandler(this, true)).OnParticleTriggerAsync(); - } - - public UniTask OnParticleTriggerAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnParticleTriggerHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnParticleTriggerAsync(); - } - } -#endregion - -#region ParticleUpdateJobScheduled -#if UNITY_2019_3_OR_NEWER && (!UNITY_2019_1_OR_NEWER || UNITASK_PARTICLESYSTEM_SUPPORT) - - public interface IAsyncOnParticleUpdateJobScheduledHandler - { - UniTask OnParticleUpdateJobScheduledAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnParticleUpdateJobScheduledHandler - { - UniTask IAsyncOnParticleUpdateJobScheduledHandler.OnParticleUpdateJobScheduledAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncParticleUpdateJobScheduledTrigger GetAsyncParticleUpdateJobScheduledTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncParticleUpdateJobScheduledTrigger GetAsyncParticleUpdateJobScheduledTrigger(this Component component) - { - return component.gameObject.GetAsyncParticleUpdateJobScheduledTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncParticleUpdateJobScheduledTrigger : AsyncTriggerBase - { - void OnParticleUpdateJobScheduled(UnityEngine.ParticleSystemJobs.ParticleSystemJobData particles) - { - RaiseEvent((particles)); - } - - public IAsyncOnParticleUpdateJobScheduledHandler GetOnParticleUpdateJobScheduledAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnParticleUpdateJobScheduledHandler GetOnParticleUpdateJobScheduledAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnParticleUpdateJobScheduledAsync() - { - return ((IAsyncOnParticleUpdateJobScheduledHandler)new AsyncTriggerHandler(this, true)).OnParticleUpdateJobScheduledAsync(); - } - - public UniTask OnParticleUpdateJobScheduledAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnParticleUpdateJobScheduledHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnParticleUpdateJobScheduledAsync(); - } - } -#endif -#endregion - -#region PostRender - - public interface IAsyncOnPostRenderHandler - { - UniTask OnPostRenderAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnPostRenderHandler - { - UniTask IAsyncOnPostRenderHandler.OnPostRenderAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncPostRenderTrigger GetAsyncPostRenderTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncPostRenderTrigger GetAsyncPostRenderTrigger(this Component component) - { - return component.gameObject.GetAsyncPostRenderTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncPostRenderTrigger : AsyncTriggerBase - { - void OnPostRender() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnPostRenderHandler GetOnPostRenderAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnPostRenderHandler GetOnPostRenderAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnPostRenderAsync() - { - return ((IAsyncOnPostRenderHandler)new AsyncTriggerHandler(this, true)).OnPostRenderAsync(); - } - - public UniTask OnPostRenderAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnPostRenderHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnPostRenderAsync(); - } - } -#endregion - -#region PreCull - - public interface IAsyncOnPreCullHandler - { - UniTask OnPreCullAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnPreCullHandler - { - UniTask IAsyncOnPreCullHandler.OnPreCullAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncPreCullTrigger GetAsyncPreCullTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncPreCullTrigger GetAsyncPreCullTrigger(this Component component) - { - return component.gameObject.GetAsyncPreCullTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncPreCullTrigger : AsyncTriggerBase - { - void OnPreCull() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnPreCullHandler GetOnPreCullAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnPreCullHandler GetOnPreCullAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnPreCullAsync() - { - return ((IAsyncOnPreCullHandler)new AsyncTriggerHandler(this, true)).OnPreCullAsync(); - } - - public UniTask OnPreCullAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnPreCullHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnPreCullAsync(); - } - } -#endregion - -#region PreRender - - public interface IAsyncOnPreRenderHandler - { - UniTask OnPreRenderAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnPreRenderHandler - { - UniTask IAsyncOnPreRenderHandler.OnPreRenderAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncPreRenderTrigger GetAsyncPreRenderTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncPreRenderTrigger GetAsyncPreRenderTrigger(this Component component) - { - return component.gameObject.GetAsyncPreRenderTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncPreRenderTrigger : AsyncTriggerBase - { - void OnPreRender() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnPreRenderHandler GetOnPreRenderAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnPreRenderHandler GetOnPreRenderAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnPreRenderAsync() - { - return ((IAsyncOnPreRenderHandler)new AsyncTriggerHandler(this, true)).OnPreRenderAsync(); - } - - public UniTask OnPreRenderAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnPreRenderHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnPreRenderAsync(); - } - } -#endregion - -#region RectTransformDimensionsChange - - public interface IAsyncOnRectTransformDimensionsChangeHandler - { - UniTask OnRectTransformDimensionsChangeAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnRectTransformDimensionsChangeHandler - { - UniTask IAsyncOnRectTransformDimensionsChangeHandler.OnRectTransformDimensionsChangeAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncRectTransformDimensionsChangeTrigger GetAsyncRectTransformDimensionsChangeTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncRectTransformDimensionsChangeTrigger GetAsyncRectTransformDimensionsChangeTrigger(this Component component) - { - return component.gameObject.GetAsyncRectTransformDimensionsChangeTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncRectTransformDimensionsChangeTrigger : AsyncTriggerBase - { - void OnRectTransformDimensionsChange() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnRectTransformDimensionsChangeHandler GetOnRectTransformDimensionsChangeAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnRectTransformDimensionsChangeHandler GetOnRectTransformDimensionsChangeAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnRectTransformDimensionsChangeAsync() - { - return ((IAsyncOnRectTransformDimensionsChangeHandler)new AsyncTriggerHandler(this, true)).OnRectTransformDimensionsChangeAsync(); - } - - public UniTask OnRectTransformDimensionsChangeAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnRectTransformDimensionsChangeHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnRectTransformDimensionsChangeAsync(); - } - } -#endregion - -#region RectTransformRemoved - - public interface IAsyncOnRectTransformRemovedHandler - { - UniTask OnRectTransformRemovedAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnRectTransformRemovedHandler - { - UniTask IAsyncOnRectTransformRemovedHandler.OnRectTransformRemovedAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncRectTransformRemovedTrigger GetAsyncRectTransformRemovedTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncRectTransformRemovedTrigger GetAsyncRectTransformRemovedTrigger(this Component component) - { - return component.gameObject.GetAsyncRectTransformRemovedTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncRectTransformRemovedTrigger : AsyncTriggerBase - { - void OnRectTransformRemoved() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnRectTransformRemovedHandler GetOnRectTransformRemovedAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnRectTransformRemovedHandler GetOnRectTransformRemovedAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnRectTransformRemovedAsync() - { - return ((IAsyncOnRectTransformRemovedHandler)new AsyncTriggerHandler(this, true)).OnRectTransformRemovedAsync(); - } - - public UniTask OnRectTransformRemovedAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnRectTransformRemovedHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnRectTransformRemovedAsync(); - } - } -#endregion - -#region RenderImage - - public interface IAsyncOnRenderImageHandler - { - UniTask<(RenderTexture source, RenderTexture destination)> OnRenderImageAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnRenderImageHandler - { - UniTask<(RenderTexture source, RenderTexture destination)> IAsyncOnRenderImageHandler.OnRenderImageAsync() - { - core.Reset(); - return new UniTask<(RenderTexture source, RenderTexture destination)>((IUniTaskSource<(RenderTexture source, RenderTexture destination)>)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncRenderImageTrigger GetAsyncRenderImageTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncRenderImageTrigger GetAsyncRenderImageTrigger(this Component component) - { - return component.gameObject.GetAsyncRenderImageTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncRenderImageTrigger : AsyncTriggerBase<(RenderTexture source, RenderTexture destination)> - { - void OnRenderImage(RenderTexture source, RenderTexture destination) - { - RaiseEvent((source, destination)); - } - - public IAsyncOnRenderImageHandler GetOnRenderImageAsyncHandler() - { - return new AsyncTriggerHandler<(RenderTexture source, RenderTexture destination)>(this, false); - } - - public IAsyncOnRenderImageHandler GetOnRenderImageAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler<(RenderTexture source, RenderTexture destination)>(this, cancellationToken, false); - } - - public UniTask<(RenderTexture source, RenderTexture destination)> OnRenderImageAsync() - { - return ((IAsyncOnRenderImageHandler)new AsyncTriggerHandler<(RenderTexture source, RenderTexture destination)>(this, true)).OnRenderImageAsync(); - } - - public UniTask<(RenderTexture source, RenderTexture destination)> OnRenderImageAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnRenderImageHandler)new AsyncTriggerHandler<(RenderTexture source, RenderTexture destination)>(this, cancellationToken, true)).OnRenderImageAsync(); - } - } -#endregion - -#region RenderObject - - public interface IAsyncOnRenderObjectHandler - { - UniTask OnRenderObjectAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnRenderObjectHandler - { - UniTask IAsyncOnRenderObjectHandler.OnRenderObjectAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncRenderObjectTrigger GetAsyncRenderObjectTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncRenderObjectTrigger GetAsyncRenderObjectTrigger(this Component component) - { - return component.gameObject.GetAsyncRenderObjectTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncRenderObjectTrigger : AsyncTriggerBase - { - void OnRenderObject() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnRenderObjectHandler GetOnRenderObjectAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnRenderObjectHandler GetOnRenderObjectAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnRenderObjectAsync() - { - return ((IAsyncOnRenderObjectHandler)new AsyncTriggerHandler(this, true)).OnRenderObjectAsync(); - } - - public UniTask OnRenderObjectAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnRenderObjectHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnRenderObjectAsync(); - } - } -#endregion - -#region ServerInitialized - - public interface IAsyncOnServerInitializedHandler - { - UniTask OnServerInitializedAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnServerInitializedHandler - { - UniTask IAsyncOnServerInitializedHandler.OnServerInitializedAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncServerInitializedTrigger GetAsyncServerInitializedTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncServerInitializedTrigger GetAsyncServerInitializedTrigger(this Component component) - { - return component.gameObject.GetAsyncServerInitializedTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncServerInitializedTrigger : AsyncTriggerBase - { - void OnServerInitialized() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnServerInitializedHandler GetOnServerInitializedAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnServerInitializedHandler GetOnServerInitializedAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnServerInitializedAsync() - { - return ((IAsyncOnServerInitializedHandler)new AsyncTriggerHandler(this, true)).OnServerInitializedAsync(); - } - - public UniTask OnServerInitializedAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnServerInitializedHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnServerInitializedAsync(); - } - } -#endregion - -#region TransformChildrenChanged - - public interface IAsyncOnTransformChildrenChangedHandler - { - UniTask OnTransformChildrenChangedAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnTransformChildrenChangedHandler - { - UniTask IAsyncOnTransformChildrenChangedHandler.OnTransformChildrenChangedAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncTransformChildrenChangedTrigger GetAsyncTransformChildrenChangedTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncTransformChildrenChangedTrigger GetAsyncTransformChildrenChangedTrigger(this Component component) - { - return component.gameObject.GetAsyncTransformChildrenChangedTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncTransformChildrenChangedTrigger : AsyncTriggerBase - { - void OnTransformChildrenChanged() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnTransformChildrenChangedHandler GetOnTransformChildrenChangedAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnTransformChildrenChangedHandler GetOnTransformChildrenChangedAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnTransformChildrenChangedAsync() - { - return ((IAsyncOnTransformChildrenChangedHandler)new AsyncTriggerHandler(this, true)).OnTransformChildrenChangedAsync(); - } - - public UniTask OnTransformChildrenChangedAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnTransformChildrenChangedHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnTransformChildrenChangedAsync(); - } - } -#endregion - -#region TransformParentChanged - - public interface IAsyncOnTransformParentChangedHandler - { - UniTask OnTransformParentChangedAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnTransformParentChangedHandler - { - UniTask IAsyncOnTransformParentChangedHandler.OnTransformParentChangedAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncTransformParentChangedTrigger GetAsyncTransformParentChangedTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncTransformParentChangedTrigger GetAsyncTransformParentChangedTrigger(this Component component) - { - return component.gameObject.GetAsyncTransformParentChangedTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncTransformParentChangedTrigger : AsyncTriggerBase - { - void OnTransformParentChanged() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnTransformParentChangedHandler GetOnTransformParentChangedAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnTransformParentChangedHandler GetOnTransformParentChangedAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnTransformParentChangedAsync() - { - return ((IAsyncOnTransformParentChangedHandler)new AsyncTriggerHandler(this, true)).OnTransformParentChangedAsync(); - } - - public UniTask OnTransformParentChangedAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnTransformParentChangedHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnTransformParentChangedAsync(); - } - } -#endregion - -#region TriggerEnter -#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS_SUPPORT - - public interface IAsyncOnTriggerEnterHandler - { - UniTask OnTriggerEnterAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnTriggerEnterHandler - { - UniTask IAsyncOnTriggerEnterHandler.OnTriggerEnterAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncTriggerEnterTrigger GetAsyncTriggerEnterTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncTriggerEnterTrigger GetAsyncTriggerEnterTrigger(this Component component) - { - return component.gameObject.GetAsyncTriggerEnterTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncTriggerEnterTrigger : AsyncTriggerBase - { - void OnTriggerEnter(Collider other) - { - RaiseEvent((other)); - } - - public IAsyncOnTriggerEnterHandler GetOnTriggerEnterAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnTriggerEnterHandler GetOnTriggerEnterAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnTriggerEnterAsync() - { - return ((IAsyncOnTriggerEnterHandler)new AsyncTriggerHandler(this, true)).OnTriggerEnterAsync(); - } - - public UniTask OnTriggerEnterAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnTriggerEnterHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnTriggerEnterAsync(); - } - } -#endif -#endregion - -#region TriggerEnter2D -#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS2D_SUPPORT - - public interface IAsyncOnTriggerEnter2DHandler - { - UniTask OnTriggerEnter2DAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnTriggerEnter2DHandler - { - UniTask IAsyncOnTriggerEnter2DHandler.OnTriggerEnter2DAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncTriggerEnter2DTrigger GetAsyncTriggerEnter2DTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncTriggerEnter2DTrigger GetAsyncTriggerEnter2DTrigger(this Component component) - { - return component.gameObject.GetAsyncTriggerEnter2DTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncTriggerEnter2DTrigger : AsyncTriggerBase - { - void OnTriggerEnter2D(Collider2D other) - { - RaiseEvent((other)); - } - - public IAsyncOnTriggerEnter2DHandler GetOnTriggerEnter2DAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnTriggerEnter2DHandler GetOnTriggerEnter2DAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnTriggerEnter2DAsync() - { - return ((IAsyncOnTriggerEnter2DHandler)new AsyncTriggerHandler(this, true)).OnTriggerEnter2DAsync(); - } - - public UniTask OnTriggerEnter2DAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnTriggerEnter2DHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnTriggerEnter2DAsync(); - } - } -#endif -#endregion - -#region TriggerExit -#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS_SUPPORT - - public interface IAsyncOnTriggerExitHandler - { - UniTask OnTriggerExitAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnTriggerExitHandler - { - UniTask IAsyncOnTriggerExitHandler.OnTriggerExitAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncTriggerExitTrigger GetAsyncTriggerExitTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncTriggerExitTrigger GetAsyncTriggerExitTrigger(this Component component) - { - return component.gameObject.GetAsyncTriggerExitTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncTriggerExitTrigger : AsyncTriggerBase - { - void OnTriggerExit(Collider other) - { - RaiseEvent((other)); - } - - public IAsyncOnTriggerExitHandler GetOnTriggerExitAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnTriggerExitHandler GetOnTriggerExitAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnTriggerExitAsync() - { - return ((IAsyncOnTriggerExitHandler)new AsyncTriggerHandler(this, true)).OnTriggerExitAsync(); - } - - public UniTask OnTriggerExitAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnTriggerExitHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnTriggerExitAsync(); - } - } -#endif -#endregion - -#region TriggerExit2D -#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS2D_SUPPORT - - public interface IAsyncOnTriggerExit2DHandler - { - UniTask OnTriggerExit2DAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnTriggerExit2DHandler - { - UniTask IAsyncOnTriggerExit2DHandler.OnTriggerExit2DAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncTriggerExit2DTrigger GetAsyncTriggerExit2DTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncTriggerExit2DTrigger GetAsyncTriggerExit2DTrigger(this Component component) - { - return component.gameObject.GetAsyncTriggerExit2DTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncTriggerExit2DTrigger : AsyncTriggerBase - { - void OnTriggerExit2D(Collider2D other) - { - RaiseEvent((other)); - } - - public IAsyncOnTriggerExit2DHandler GetOnTriggerExit2DAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnTriggerExit2DHandler GetOnTriggerExit2DAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnTriggerExit2DAsync() - { - return ((IAsyncOnTriggerExit2DHandler)new AsyncTriggerHandler(this, true)).OnTriggerExit2DAsync(); - } - - public UniTask OnTriggerExit2DAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnTriggerExit2DHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnTriggerExit2DAsync(); - } - } -#endif -#endregion - -#region TriggerStay -#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS_SUPPORT - - public interface IAsyncOnTriggerStayHandler - { - UniTask OnTriggerStayAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnTriggerStayHandler - { - UniTask IAsyncOnTriggerStayHandler.OnTriggerStayAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncTriggerStayTrigger GetAsyncTriggerStayTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncTriggerStayTrigger GetAsyncTriggerStayTrigger(this Component component) - { - return component.gameObject.GetAsyncTriggerStayTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncTriggerStayTrigger : AsyncTriggerBase - { - void OnTriggerStay(Collider other) - { - RaiseEvent((other)); - } - - public IAsyncOnTriggerStayHandler GetOnTriggerStayAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnTriggerStayHandler GetOnTriggerStayAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnTriggerStayAsync() - { - return ((IAsyncOnTriggerStayHandler)new AsyncTriggerHandler(this, true)).OnTriggerStayAsync(); - } - - public UniTask OnTriggerStayAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnTriggerStayHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnTriggerStayAsync(); - } - } -#endif -#endregion - -#region TriggerStay2D -#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS2D_SUPPORT - - public interface IAsyncOnTriggerStay2DHandler - { - UniTask OnTriggerStay2DAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnTriggerStay2DHandler - { - UniTask IAsyncOnTriggerStay2DHandler.OnTriggerStay2DAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncTriggerStay2DTrigger GetAsyncTriggerStay2DTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncTriggerStay2DTrigger GetAsyncTriggerStay2DTrigger(this Component component) - { - return component.gameObject.GetAsyncTriggerStay2DTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncTriggerStay2DTrigger : AsyncTriggerBase - { - void OnTriggerStay2D(Collider2D other) - { - RaiseEvent((other)); - } - - public IAsyncOnTriggerStay2DHandler GetOnTriggerStay2DAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnTriggerStay2DHandler GetOnTriggerStay2DAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnTriggerStay2DAsync() - { - return ((IAsyncOnTriggerStay2DHandler)new AsyncTriggerHandler(this, true)).OnTriggerStay2DAsync(); - } - - public UniTask OnTriggerStay2DAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnTriggerStay2DHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnTriggerStay2DAsync(); - } - } -#endif -#endregion - -#region Validate - - public interface IAsyncOnValidateHandler - { - UniTask OnValidateAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnValidateHandler - { - UniTask IAsyncOnValidateHandler.OnValidateAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncValidateTrigger GetAsyncValidateTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncValidateTrigger GetAsyncValidateTrigger(this Component component) - { - return component.gameObject.GetAsyncValidateTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncValidateTrigger : AsyncTriggerBase - { - void OnValidate() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnValidateHandler GetOnValidateAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnValidateHandler GetOnValidateAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnValidateAsync() - { - return ((IAsyncOnValidateHandler)new AsyncTriggerHandler(this, true)).OnValidateAsync(); - } - - public UniTask OnValidateAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnValidateHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnValidateAsync(); - } - } -#endregion - -#region WillRenderObject - - public interface IAsyncOnWillRenderObjectHandler - { - UniTask OnWillRenderObjectAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnWillRenderObjectHandler - { - UniTask IAsyncOnWillRenderObjectHandler.OnWillRenderObjectAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncWillRenderObjectTrigger GetAsyncWillRenderObjectTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncWillRenderObjectTrigger GetAsyncWillRenderObjectTrigger(this Component component) - { - return component.gameObject.GetAsyncWillRenderObjectTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncWillRenderObjectTrigger : AsyncTriggerBase - { - void OnWillRenderObject() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncOnWillRenderObjectHandler GetOnWillRenderObjectAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnWillRenderObjectHandler GetOnWillRenderObjectAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnWillRenderObjectAsync() - { - return ((IAsyncOnWillRenderObjectHandler)new AsyncTriggerHandler(this, true)).OnWillRenderObjectAsync(); - } - - public UniTask OnWillRenderObjectAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnWillRenderObjectHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnWillRenderObjectAsync(); - } - } -#endregion - -#region Reset - - public interface IAsyncResetHandler - { - UniTask ResetAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncResetHandler - { - UniTask IAsyncResetHandler.ResetAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncResetTrigger GetAsyncResetTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncResetTrigger GetAsyncResetTrigger(this Component component) - { - return component.gameObject.GetAsyncResetTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncResetTrigger : AsyncTriggerBase - { - void Reset() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncResetHandler GetResetAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncResetHandler GetResetAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask ResetAsync() - { - return ((IAsyncResetHandler)new AsyncTriggerHandler(this, true)).ResetAsync(); - } - - public UniTask ResetAsync(CancellationToken cancellationToken) - { - return ((IAsyncResetHandler)new AsyncTriggerHandler(this, cancellationToken, true)).ResetAsync(); - } - } -#endregion - -#region Update - - public interface IAsyncUpdateHandler - { - UniTask UpdateAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncUpdateHandler - { - UniTask IAsyncUpdateHandler.UpdateAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncUpdateTrigger GetAsyncUpdateTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncUpdateTrigger GetAsyncUpdateTrigger(this Component component) - { - return component.gameObject.GetAsyncUpdateTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncUpdateTrigger : AsyncTriggerBase - { - void Update() - { - RaiseEvent(AsyncUnit.Default); - } - - public IAsyncUpdateHandler GetUpdateAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncUpdateHandler GetUpdateAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask UpdateAsync() - { - return ((IAsyncUpdateHandler)new AsyncTriggerHandler(this, true)).UpdateAsync(); - } - - public UniTask UpdateAsync(CancellationToken cancellationToken) - { - return ((IAsyncUpdateHandler)new AsyncTriggerHandler(this, cancellationToken, true)).UpdateAsync(); - } - } -#endregion - -#region BeginDrag -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT - - public interface IAsyncOnBeginDragHandler - { - UniTask OnBeginDragAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnBeginDragHandler - { - UniTask IAsyncOnBeginDragHandler.OnBeginDragAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncBeginDragTrigger GetAsyncBeginDragTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncBeginDragTrigger GetAsyncBeginDragTrigger(this Component component) - { - return component.gameObject.GetAsyncBeginDragTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncBeginDragTrigger : AsyncTriggerBase, IBeginDragHandler - { - void IBeginDragHandler.OnBeginDrag(PointerEventData eventData) - { - RaiseEvent((eventData)); - } - - public IAsyncOnBeginDragHandler GetOnBeginDragAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnBeginDragHandler GetOnBeginDragAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnBeginDragAsync() - { - return ((IAsyncOnBeginDragHandler)new AsyncTriggerHandler(this, true)).OnBeginDragAsync(); - } - - public UniTask OnBeginDragAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnBeginDragHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnBeginDragAsync(); - } - } -#endif -#endregion - -#region Cancel -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT - - public interface IAsyncOnCancelHandler - { - UniTask OnCancelAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnCancelHandler - { - UniTask IAsyncOnCancelHandler.OnCancelAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncCancelTrigger GetAsyncCancelTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncCancelTrigger GetAsyncCancelTrigger(this Component component) - { - return component.gameObject.GetAsyncCancelTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncCancelTrigger : AsyncTriggerBase, ICancelHandler - { - void ICancelHandler.OnCancel(BaseEventData eventData) - { - RaiseEvent((eventData)); - } - - public IAsyncOnCancelHandler GetOnCancelAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnCancelHandler GetOnCancelAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnCancelAsync() - { - return ((IAsyncOnCancelHandler)new AsyncTriggerHandler(this, true)).OnCancelAsync(); - } - - public UniTask OnCancelAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnCancelHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnCancelAsync(); - } - } -#endif -#endregion - -#region Deselect -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT - - public interface IAsyncOnDeselectHandler - { - UniTask OnDeselectAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnDeselectHandler - { - UniTask IAsyncOnDeselectHandler.OnDeselectAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncDeselectTrigger GetAsyncDeselectTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncDeselectTrigger GetAsyncDeselectTrigger(this Component component) - { - return component.gameObject.GetAsyncDeselectTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncDeselectTrigger : AsyncTriggerBase, IDeselectHandler - { - void IDeselectHandler.OnDeselect(BaseEventData eventData) - { - RaiseEvent((eventData)); - } - - public IAsyncOnDeselectHandler GetOnDeselectAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnDeselectHandler GetOnDeselectAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnDeselectAsync() - { - return ((IAsyncOnDeselectHandler)new AsyncTriggerHandler(this, true)).OnDeselectAsync(); - } - - public UniTask OnDeselectAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnDeselectHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnDeselectAsync(); - } - } -#endif -#endregion - -#region Drag -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT - - public interface IAsyncOnDragHandler - { - UniTask OnDragAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnDragHandler - { - UniTask IAsyncOnDragHandler.OnDragAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncDragTrigger GetAsyncDragTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncDragTrigger GetAsyncDragTrigger(this Component component) - { - return component.gameObject.GetAsyncDragTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncDragTrigger : AsyncTriggerBase, IDragHandler - { - void IDragHandler.OnDrag(PointerEventData eventData) - { - RaiseEvent((eventData)); - } - - public IAsyncOnDragHandler GetOnDragAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnDragHandler GetOnDragAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnDragAsync() - { - return ((IAsyncOnDragHandler)new AsyncTriggerHandler(this, true)).OnDragAsync(); - } - - public UniTask OnDragAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnDragHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnDragAsync(); - } - } -#endif -#endregion - -#region Drop -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT - - public interface IAsyncOnDropHandler - { - UniTask OnDropAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnDropHandler - { - UniTask IAsyncOnDropHandler.OnDropAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncDropTrigger GetAsyncDropTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncDropTrigger GetAsyncDropTrigger(this Component component) - { - return component.gameObject.GetAsyncDropTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncDropTrigger : AsyncTriggerBase, IDropHandler - { - void IDropHandler.OnDrop(PointerEventData eventData) - { - RaiseEvent((eventData)); - } - - public IAsyncOnDropHandler GetOnDropAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnDropHandler GetOnDropAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnDropAsync() - { - return ((IAsyncOnDropHandler)new AsyncTriggerHandler(this, true)).OnDropAsync(); - } - - public UniTask OnDropAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnDropHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnDropAsync(); - } - } -#endif -#endregion - -#region EndDrag -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT - - public interface IAsyncOnEndDragHandler - { - UniTask OnEndDragAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnEndDragHandler - { - UniTask IAsyncOnEndDragHandler.OnEndDragAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncEndDragTrigger GetAsyncEndDragTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncEndDragTrigger GetAsyncEndDragTrigger(this Component component) - { - return component.gameObject.GetAsyncEndDragTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncEndDragTrigger : AsyncTriggerBase, IEndDragHandler - { - void IEndDragHandler.OnEndDrag(PointerEventData eventData) - { - RaiseEvent((eventData)); - } - - public IAsyncOnEndDragHandler GetOnEndDragAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnEndDragHandler GetOnEndDragAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnEndDragAsync() - { - return ((IAsyncOnEndDragHandler)new AsyncTriggerHandler(this, true)).OnEndDragAsync(); - } - - public UniTask OnEndDragAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnEndDragHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnEndDragAsync(); - } - } -#endif -#endregion - -#region InitializePotentialDrag -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT - - public interface IAsyncOnInitializePotentialDragHandler - { - UniTask OnInitializePotentialDragAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnInitializePotentialDragHandler - { - UniTask IAsyncOnInitializePotentialDragHandler.OnInitializePotentialDragAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncInitializePotentialDragTrigger GetAsyncInitializePotentialDragTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncInitializePotentialDragTrigger GetAsyncInitializePotentialDragTrigger(this Component component) - { - return component.gameObject.GetAsyncInitializePotentialDragTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncInitializePotentialDragTrigger : AsyncTriggerBase, IInitializePotentialDragHandler - { - void IInitializePotentialDragHandler.OnInitializePotentialDrag(PointerEventData eventData) - { - RaiseEvent((eventData)); - } - - public IAsyncOnInitializePotentialDragHandler GetOnInitializePotentialDragAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnInitializePotentialDragHandler GetOnInitializePotentialDragAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnInitializePotentialDragAsync() - { - return ((IAsyncOnInitializePotentialDragHandler)new AsyncTriggerHandler(this, true)).OnInitializePotentialDragAsync(); - } - - public UniTask OnInitializePotentialDragAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnInitializePotentialDragHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnInitializePotentialDragAsync(); - } - } -#endif -#endregion - -#region Move -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT - - public interface IAsyncOnMoveHandler - { - UniTask OnMoveAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnMoveHandler - { - UniTask IAsyncOnMoveHandler.OnMoveAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncMoveTrigger GetAsyncMoveTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncMoveTrigger GetAsyncMoveTrigger(this Component component) - { - return component.gameObject.GetAsyncMoveTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncMoveTrigger : AsyncTriggerBase, IMoveHandler - { - void IMoveHandler.OnMove(AxisEventData eventData) - { - RaiseEvent((eventData)); - } - - public IAsyncOnMoveHandler GetOnMoveAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnMoveHandler GetOnMoveAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnMoveAsync() - { - return ((IAsyncOnMoveHandler)new AsyncTriggerHandler(this, true)).OnMoveAsync(); - } - - public UniTask OnMoveAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnMoveHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnMoveAsync(); - } - } -#endif -#endregion - -#region PointerClick -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT - - public interface IAsyncOnPointerClickHandler - { - UniTask OnPointerClickAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnPointerClickHandler - { - UniTask IAsyncOnPointerClickHandler.OnPointerClickAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncPointerClickTrigger GetAsyncPointerClickTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncPointerClickTrigger GetAsyncPointerClickTrigger(this Component component) - { - return component.gameObject.GetAsyncPointerClickTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncPointerClickTrigger : AsyncTriggerBase, IPointerClickHandler - { - void IPointerClickHandler.OnPointerClick(PointerEventData eventData) - { - RaiseEvent((eventData)); - } - - public IAsyncOnPointerClickHandler GetOnPointerClickAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnPointerClickHandler GetOnPointerClickAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnPointerClickAsync() - { - return ((IAsyncOnPointerClickHandler)new AsyncTriggerHandler(this, true)).OnPointerClickAsync(); - } - - public UniTask OnPointerClickAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnPointerClickHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnPointerClickAsync(); - } - } -#endif -#endregion - -#region PointerDown -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT - - public interface IAsyncOnPointerDownHandler - { - UniTask OnPointerDownAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnPointerDownHandler - { - UniTask IAsyncOnPointerDownHandler.OnPointerDownAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncPointerDownTrigger GetAsyncPointerDownTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncPointerDownTrigger GetAsyncPointerDownTrigger(this Component component) - { - return component.gameObject.GetAsyncPointerDownTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncPointerDownTrigger : AsyncTriggerBase, IPointerDownHandler - { - void IPointerDownHandler.OnPointerDown(PointerEventData eventData) - { - RaiseEvent((eventData)); - } - - public IAsyncOnPointerDownHandler GetOnPointerDownAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnPointerDownHandler GetOnPointerDownAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnPointerDownAsync() - { - return ((IAsyncOnPointerDownHandler)new AsyncTriggerHandler(this, true)).OnPointerDownAsync(); - } - - public UniTask OnPointerDownAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnPointerDownHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnPointerDownAsync(); - } - } -#endif -#endregion - -#region PointerEnter -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT - - public interface IAsyncOnPointerEnterHandler - { - UniTask OnPointerEnterAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnPointerEnterHandler - { - UniTask IAsyncOnPointerEnterHandler.OnPointerEnterAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncPointerEnterTrigger GetAsyncPointerEnterTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncPointerEnterTrigger GetAsyncPointerEnterTrigger(this Component component) - { - return component.gameObject.GetAsyncPointerEnterTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncPointerEnterTrigger : AsyncTriggerBase, IPointerEnterHandler - { - void IPointerEnterHandler.OnPointerEnter(PointerEventData eventData) - { - RaiseEvent((eventData)); - } - - public IAsyncOnPointerEnterHandler GetOnPointerEnterAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnPointerEnterHandler GetOnPointerEnterAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnPointerEnterAsync() - { - return ((IAsyncOnPointerEnterHandler)new AsyncTriggerHandler(this, true)).OnPointerEnterAsync(); - } - - public UniTask OnPointerEnterAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnPointerEnterHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnPointerEnterAsync(); - } - } -#endif -#endregion - -#region PointerExit -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT - - public interface IAsyncOnPointerExitHandler - { - UniTask OnPointerExitAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnPointerExitHandler - { - UniTask IAsyncOnPointerExitHandler.OnPointerExitAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncPointerExitTrigger GetAsyncPointerExitTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncPointerExitTrigger GetAsyncPointerExitTrigger(this Component component) - { - return component.gameObject.GetAsyncPointerExitTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncPointerExitTrigger : AsyncTriggerBase, IPointerExitHandler - { - void IPointerExitHandler.OnPointerExit(PointerEventData eventData) - { - RaiseEvent((eventData)); - } - - public IAsyncOnPointerExitHandler GetOnPointerExitAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnPointerExitHandler GetOnPointerExitAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnPointerExitAsync() - { - return ((IAsyncOnPointerExitHandler)new AsyncTriggerHandler(this, true)).OnPointerExitAsync(); - } - - public UniTask OnPointerExitAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnPointerExitHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnPointerExitAsync(); - } - } -#endif -#endregion - -#region PointerUp -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT - - public interface IAsyncOnPointerUpHandler - { - UniTask OnPointerUpAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnPointerUpHandler - { - UniTask IAsyncOnPointerUpHandler.OnPointerUpAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncPointerUpTrigger GetAsyncPointerUpTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncPointerUpTrigger GetAsyncPointerUpTrigger(this Component component) - { - return component.gameObject.GetAsyncPointerUpTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncPointerUpTrigger : AsyncTriggerBase, IPointerUpHandler - { - void IPointerUpHandler.OnPointerUp(PointerEventData eventData) - { - RaiseEvent((eventData)); - } - - public IAsyncOnPointerUpHandler GetOnPointerUpAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnPointerUpHandler GetOnPointerUpAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnPointerUpAsync() - { - return ((IAsyncOnPointerUpHandler)new AsyncTriggerHandler(this, true)).OnPointerUpAsync(); - } - - public UniTask OnPointerUpAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnPointerUpHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnPointerUpAsync(); - } - } -#endif -#endregion - -#region Scroll -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT - - public interface IAsyncOnScrollHandler - { - UniTask OnScrollAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnScrollHandler - { - UniTask IAsyncOnScrollHandler.OnScrollAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncScrollTrigger GetAsyncScrollTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncScrollTrigger GetAsyncScrollTrigger(this Component component) - { - return component.gameObject.GetAsyncScrollTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncScrollTrigger : AsyncTriggerBase, IScrollHandler - { - void IScrollHandler.OnScroll(PointerEventData eventData) - { - RaiseEvent((eventData)); - } - - public IAsyncOnScrollHandler GetOnScrollAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnScrollHandler GetOnScrollAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnScrollAsync() - { - return ((IAsyncOnScrollHandler)new AsyncTriggerHandler(this, true)).OnScrollAsync(); - } - - public UniTask OnScrollAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnScrollHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnScrollAsync(); - } - } -#endif -#endregion - -#region Select -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT - - public interface IAsyncOnSelectHandler - { - UniTask OnSelectAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnSelectHandler - { - UniTask IAsyncOnSelectHandler.OnSelectAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncSelectTrigger GetAsyncSelectTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncSelectTrigger GetAsyncSelectTrigger(this Component component) - { - return component.gameObject.GetAsyncSelectTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncSelectTrigger : AsyncTriggerBase, ISelectHandler - { - void ISelectHandler.OnSelect(BaseEventData eventData) - { - RaiseEvent((eventData)); - } - - public IAsyncOnSelectHandler GetOnSelectAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnSelectHandler GetOnSelectAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnSelectAsync() - { - return ((IAsyncOnSelectHandler)new AsyncTriggerHandler(this, true)).OnSelectAsync(); - } - - public UniTask OnSelectAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnSelectHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnSelectAsync(); - } - } -#endif -#endregion - -#region Submit -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT - - public interface IAsyncOnSubmitHandler - { - UniTask OnSubmitAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnSubmitHandler - { - UniTask IAsyncOnSubmitHandler.OnSubmitAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncSubmitTrigger GetAsyncSubmitTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncSubmitTrigger GetAsyncSubmitTrigger(this Component component) - { - return component.gameObject.GetAsyncSubmitTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncSubmitTrigger : AsyncTriggerBase, ISubmitHandler - { - void ISubmitHandler.OnSubmit(BaseEventData eventData) - { - RaiseEvent((eventData)); - } - - public IAsyncOnSubmitHandler GetOnSubmitAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnSubmitHandler GetOnSubmitAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnSubmitAsync() - { - return ((IAsyncOnSubmitHandler)new AsyncTriggerHandler(this, true)).OnSubmitAsync(); - } - - public UniTask OnSubmitAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnSubmitHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnSubmitAsync(); - } - } -#endif -#endregion - -#region UpdateSelected -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT - - public interface IAsyncOnUpdateSelectedHandler - { - UniTask OnUpdateSelectedAsync(); - } - - public partial class AsyncTriggerHandler : IAsyncOnUpdateSelectedHandler - { - UniTask IAsyncOnUpdateSelectedHandler.OnUpdateSelectedAsync() - { - core.Reset(); - return new UniTask((IUniTaskSource)(object)this, core.Version); - } - } - - public static partial class AsyncTriggerExtensions - { - public static AsyncUpdateSelectedTrigger GetAsyncUpdateSelectedTrigger(this GameObject gameObject) - { - return GetOrAddComponent(gameObject); - } - - public static AsyncUpdateSelectedTrigger GetAsyncUpdateSelectedTrigger(this Component component) - { - return component.gameObject.GetAsyncUpdateSelectedTrigger(); - } - } - - [DisallowMultipleComponent] - public sealed class AsyncUpdateSelectedTrigger : AsyncTriggerBase, IUpdateSelectedHandler - { - void IUpdateSelectedHandler.OnUpdateSelected(BaseEventData eventData) - { - RaiseEvent((eventData)); - } - - public IAsyncOnUpdateSelectedHandler GetOnUpdateSelectedAsyncHandler() - { - return new AsyncTriggerHandler(this, false); - } - - public IAsyncOnUpdateSelectedHandler GetOnUpdateSelectedAsyncHandler(CancellationToken cancellationToken) - { - return new AsyncTriggerHandler(this, cancellationToken, false); - } - - public UniTask OnUpdateSelectedAsync() - { - return ((IAsyncOnUpdateSelectedHandler)new AsyncTriggerHandler(this, true)).OnUpdateSelectedAsync(); - } - - public UniTask OnUpdateSelectedAsync(CancellationToken cancellationToken) - { - return ((IAsyncOnUpdateSelectedHandler)new AsyncTriggerHandler(this, cancellationToken, true)).OnUpdateSelectedAsync(); - } - } -#endif -#endregion - -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/Triggers/MonoBehaviourMessagesTriggers.cs.meta b/VirtueSky/UniTask/Runtime/Triggers/MonoBehaviourMessagesTriggers.cs.meta deleted file mode 100644 index 82aa6792..00000000 --- a/VirtueSky/UniTask/Runtime/Triggers/MonoBehaviourMessagesTriggers.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c30655636c35c3d4da44064af3d2d9a7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTask.AsValueTask.cs b/VirtueSky/UniTask/Runtime/UniTask.AsValueTask.cs deleted file mode 100644 index efc1935d..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.AsValueTask.cs +++ /dev/null @@ -1,104 +0,0 @@ -#pragma warning disable 0649 - -#if UNITASK_NETCORE || UNITY_2022_3_OR_NEWER -#define SUPPORT_VALUETASK -#endif - -#if SUPPORT_VALUETASK - -using System; -using System.Threading.Tasks; -using System.Threading.Tasks.Sources; - -namespace VirtueSky.Threading.Tasks -{ - public static class UniTaskValueTaskExtensions - { - public static ValueTask AsValueTask(this in UniTask task) - { -#if (UNITASK_NETCORE && NETSTANDARD2_0) - return new ValueTask(new UniTaskValueTaskSource(task), 0); -#else - return task; -#endif - } - - public static ValueTask AsValueTask(this in UniTask task) - { -#if (UNITASK_NETCORE && NETSTANDARD2_0) - return new ValueTask(new UniTaskValueTaskSource(task), 0); -#else - return task; -#endif - } - - public static async UniTask AsUniTask(this ValueTask task) - { - return await task; - } - - public static async UniTask AsUniTask(this ValueTask task) - { - await task; - } - -#if (UNITASK_NETCORE && NETSTANDARD2_0) - - class UniTaskValueTaskSource : IValueTaskSource - { - readonly UniTask task; - readonly UniTask.Awaiter awaiter; - - public UniTaskValueTaskSource(UniTask task) - { - this.task = task; - this.awaiter = task.GetAwaiter(); - } - - public void GetResult(short token) - { - awaiter.GetResult(); - } - - public ValueTaskSourceStatus GetStatus(short token) - { - return (ValueTaskSourceStatus)task.Status; - } - - public void OnCompleted(Action continuation, object state, short token, ValueTaskSourceOnCompletedFlags flags) - { - awaiter.SourceOnCompleted(continuation, state); - } - } - - class UniTaskValueTaskSource : IValueTaskSource - { - readonly UniTask task; - readonly UniTask.Awaiter awaiter; - - public UniTaskValueTaskSource(UniTask task) - { - this.task = task; - this.awaiter = task.GetAwaiter(); - } - - public T GetResult(short token) - { - return awaiter.GetResult(); - } - - public ValueTaskSourceStatus GetStatus(short token) - { - return (ValueTaskSourceStatus)task.Status; - } - - public void OnCompleted(Action continuation, object state, short token, ValueTaskSourceOnCompletedFlags flags) - { - awaiter.SourceOnCompleted(continuation, state); - } - } - -#endif - } -} -#endif diff --git a/VirtueSky/UniTask/Runtime/UniTask.AsValueTask.cs.meta b/VirtueSky/UniTask/Runtime/UniTask.AsValueTask.cs.meta deleted file mode 100644 index 801bce1c..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.AsValueTask.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d38f0478933be42d895c37b862540a1c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTask.Bridge.cs b/VirtueSky/UniTask/Runtime/UniTask.Bridge.cs deleted file mode 100644 index a31a70cd..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.Bridge.cs +++ /dev/null @@ -1,18 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Collections; - -namespace VirtueSky.Threading.Tasks -{ - // UnityEngine Bridges. - - public partial struct UniTask - { - public static IEnumerator ToCoroutine(Func taskFactory) - { - return taskFactory().ToCoroutine(); - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/UniTask.Bridge.cs.meta b/VirtueSky/UniTask/Runtime/UniTask.Bridge.cs.meta deleted file mode 100644 index 6f8da804..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.Bridge.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: bd6beac8e0ebd264e9ba246c39429c72 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTask.Delay.cs b/VirtueSky/UniTask/Runtime/UniTask.Delay.cs deleted file mode 100644 index 3740a9d2..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.Delay.cs +++ /dev/null @@ -1,1104 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Collections; -using System.Runtime.CompilerServices; -using System.Threading; -using UnityEngine; - -namespace VirtueSky.Threading.Tasks -{ - public enum DelayType - { - /// use Time.deltaTime. - DeltaTime, - /// Ignore timescale, use Time.unscaledDeltaTime. - UnscaledDeltaTime, - /// use Stopwatch.GetTimestamp(). - Realtime - } - - public partial struct UniTask - { - public static YieldAwaitable Yield() - { - // optimized for single continuation - return new YieldAwaitable(PlayerLoopTiming.Update); - } - - public static YieldAwaitable Yield(PlayerLoopTiming timing) - { - // optimized for single continuation - return new YieldAwaitable(timing); - } - - public static UniTask Yield(CancellationToken cancellationToken, bool cancelImmediately = false) - { - return new UniTask(YieldPromise.Create(PlayerLoopTiming.Update, cancellationToken, cancelImmediately, out var token), token); - } - - public static UniTask Yield(PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately = false) - { - return new UniTask(YieldPromise.Create(timing, cancellationToken, cancelImmediately, out var token), token); - } - - /// - /// Similar as UniTask.Yield but guaranteed run on next frame. - /// - public static UniTask NextFrame() - { - return new UniTask(NextFramePromise.Create(PlayerLoopTiming.Update, CancellationToken.None, false, out var token), token); - } - - /// - /// Similar as UniTask.Yield but guaranteed run on next frame. - /// - public static UniTask NextFrame(PlayerLoopTiming timing) - { - return new UniTask(NextFramePromise.Create(timing, CancellationToken.None, false, out var token), token); - } - - /// - /// Similar as UniTask.Yield but guaranteed run on next frame. - /// - public static UniTask NextFrame(CancellationToken cancellationToken, bool cancelImmediately = false) - { - return new UniTask(NextFramePromise.Create(PlayerLoopTiming.Update, cancellationToken, cancelImmediately, out var token), token); - } - - /// - /// Similar as UniTask.Yield but guaranteed run on next frame. - /// - public static UniTask NextFrame(PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately = false) - { - return new UniTask(NextFramePromise.Create(timing, cancellationToken, cancelImmediately, out var token), token); - } - -#if UNITY_2023_1_OR_NEWER - public static async UniTask WaitForEndOfFrame(CancellationToken cancellationToken = default) - { - await Awaitable.EndOfFrameAsync(cancellationToken); - } -#else - [Obsolete("Use WaitForEndOfFrame(MonoBehaviour) instead or UniTask.Yield(PlayerLoopTiming.LastPostLateUpdate). Equivalent for coroutine's WaitForEndOfFrame requires MonoBehaviour(runner of Coroutine).")] - public static YieldAwaitable WaitForEndOfFrame() - { - return UniTask.Yield(PlayerLoopTiming.LastPostLateUpdate); - } - - [Obsolete("Use WaitForEndOfFrame(MonoBehaviour) instead or UniTask.Yield(PlayerLoopTiming.LastPostLateUpdate). Equivalent for coroutine's WaitForEndOfFrame requires MonoBehaviour(runner of Coroutine).")] - public static UniTask WaitForEndOfFrame(CancellationToken cancellationToken, bool cancelImmediately = false) - { - return UniTask.Yield(PlayerLoopTiming.LastPostLateUpdate, cancellationToken, cancelImmediately); - } -#endif - - public static UniTask WaitForEndOfFrame(MonoBehaviour coroutineRunner) - { - var source = WaitForEndOfFramePromise.Create(coroutineRunner, CancellationToken.None, false, out var token); - return new UniTask(source, token); - } - - public static UniTask WaitForEndOfFrame(MonoBehaviour coroutineRunner, CancellationToken cancellationToken, bool cancelImmediately = false) - { - var source = WaitForEndOfFramePromise.Create(coroutineRunner, cancellationToken, cancelImmediately, out var token); - return new UniTask(source, token); - } - - /// - /// Same as UniTask.Yield(PlayerLoopTiming.LastFixedUpdate). - /// - public static YieldAwaitable WaitForFixedUpdate() - { - // use LastFixedUpdate instead of FixedUpdate - // https://github.com/Cysharp/UniTask/issues/377 - return UniTask.Yield(PlayerLoopTiming.LastFixedUpdate); - } - - /// - /// Same as UniTask.Yield(PlayerLoopTiming.LastFixedUpdate, cancellationToken). - /// - public static UniTask WaitForFixedUpdate(CancellationToken cancellationToken, bool cancelImmediately = false) - { - return UniTask.Yield(PlayerLoopTiming.LastFixedUpdate, cancellationToken, cancelImmediately); - } - - public static UniTask WaitForSeconds(float duration, bool ignoreTimeScale = false, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) - { - return Delay(Mathf.RoundToInt(1000 * duration), ignoreTimeScale, delayTiming, cancellationToken, cancelImmediately); - } - - public static UniTask WaitForSeconds(int duration, bool ignoreTimeScale = false, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) - { - return Delay(1000 * duration, ignoreTimeScale, delayTiming, cancellationToken, cancelImmediately); - } - - public static UniTask DelayFrame(int delayFrameCount, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) - { - if (delayFrameCount < 0) - { - throw new ArgumentOutOfRangeException("Delay does not allow minus delayFrameCount. delayFrameCount:" + delayFrameCount); - } - - return new UniTask(DelayFramePromise.Create(delayFrameCount, delayTiming, cancellationToken, cancelImmediately, out var token), token); - } - - public static UniTask Delay(int millisecondsDelay, bool ignoreTimeScale = false, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) - { - var delayTimeSpan = TimeSpan.FromMilliseconds(millisecondsDelay); - return Delay(delayTimeSpan, ignoreTimeScale, delayTiming, cancellationToken, cancelImmediately); - } - - public static UniTask Delay(TimeSpan delayTimeSpan, bool ignoreTimeScale = false, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) - { - var delayType = ignoreTimeScale ? DelayType.UnscaledDeltaTime : DelayType.DeltaTime; - return Delay(delayTimeSpan, delayType, delayTiming, cancellationToken, cancelImmediately); - } - - public static UniTask Delay(int millisecondsDelay, DelayType delayType, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) - { - var delayTimeSpan = TimeSpan.FromMilliseconds(millisecondsDelay); - return Delay(delayTimeSpan, delayType, delayTiming, cancellationToken, cancelImmediately); - } - - public static UniTask Delay(TimeSpan delayTimeSpan, DelayType delayType, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) - { - if (delayTimeSpan < TimeSpan.Zero) - { - throw new ArgumentOutOfRangeException("Delay does not allow minus delayTimeSpan. delayTimeSpan:" + delayTimeSpan); - } - -#if UNITY_EDITOR - // force use Realtime. - if (PlayerLoopHelper.IsMainThread && !UnityEditor.EditorApplication.isPlaying) - { - delayType = DelayType.Realtime; - } -#endif - - switch (delayType) - { - case DelayType.UnscaledDeltaTime: - { - return new UniTask(DelayIgnoreTimeScalePromise.Create(delayTimeSpan, delayTiming, cancellationToken, cancelImmediately, out var token), token); - } - case DelayType.Realtime: - { - return new UniTask(DelayRealtimePromise.Create(delayTimeSpan, delayTiming, cancellationToken, cancelImmediately, out var token), token); - } - case DelayType.DeltaTime: - default: - { - return new UniTask(DelayPromise.Create(delayTimeSpan, delayTiming, cancellationToken, cancelImmediately, out var token), token); - } - } - } - - sealed class YieldPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode - { - static TaskPool pool; - YieldPromise nextNode; - public ref YieldPromise NextNode => ref nextNode; - - static YieldPromise() - { - TaskPool.RegisterSizeGetter(typeof(YieldPromise), () => pool.Size); - } - - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - UniTaskCompletionSourceCore core; - - YieldPromise() - { - } - - public static IUniTaskSource Create(PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new YieldPromise(); - } - - result.cancellationToken = cancellationToken; - result.cancelImmediately = cancelImmediately; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var promise = (YieldPromise)state; - promise.core.TrySetCanceled(promise.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - token = result.core.Version; - return result; - } - - public void GetResult(short token) - { - try - { - core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - return false; - } - - core.TrySetResult(null); - return false; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - cancelImmediately = default; - return pool.TryPush(this); - } - } - - sealed class NextFramePromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode - { - static TaskPool pool; - NextFramePromise nextNode; - public ref NextFramePromise NextNode => ref nextNode; - - static NextFramePromise() - { - TaskPool.RegisterSizeGetter(typeof(NextFramePromise), () => pool.Size); - } - - int frameCount; - UniTaskCompletionSourceCore core; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - - NextFramePromise() - { - } - - public static IUniTaskSource Create(PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new NextFramePromise(); - } - - result.frameCount = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1; - result.cancellationToken = cancellationToken; - result.cancelImmediately = cancelImmediately; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var promise = (NextFramePromise)state; - promise.core.TrySetCanceled(promise.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - token = result.core.Version; - return result; - } - - public void GetResult(short token) - { - try - { - core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - return false; - } - - if (frameCount == Time.frameCount) - { - return true; - } - - core.TrySetResult(AsyncUnit.Default); - return false; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - return pool.TryPush(this); - } - } - - sealed class WaitForEndOfFramePromise : IUniTaskSource, ITaskPoolNode, System.Collections.IEnumerator - { - static TaskPool pool; - WaitForEndOfFramePromise nextNode; - public ref WaitForEndOfFramePromise NextNode => ref nextNode; - - static WaitForEndOfFramePromise() - { - TaskPool.RegisterSizeGetter(typeof(WaitForEndOfFramePromise), () => pool.Size); - } - - UniTaskCompletionSourceCore core; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - - WaitForEndOfFramePromise() - { - } - - public static IUniTaskSource Create(MonoBehaviour coroutineRunner, CancellationToken cancellationToken, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new WaitForEndOfFramePromise(); - } - - result.cancellationToken = cancellationToken; - result.cancelImmediately = cancelImmediately; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var promise = (WaitForEndOfFramePromise)state; - promise.core.TrySetCanceled(promise.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - coroutineRunner.StartCoroutine(result); - - token = result.core.Version; - return result; - } - - public void GetResult(short token) - { - try - { - core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - Reset(); // Reset Enumerator - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - return pool.TryPush(this); - } - - // Coroutine Runner implementation - - static readonly WaitForEndOfFrame waitForEndOfFrameYieldInstruction = new WaitForEndOfFrame(); - bool isFirst = true; - - object IEnumerator.Current => waitForEndOfFrameYieldInstruction; - - bool IEnumerator.MoveNext() - { - if (isFirst) - { - isFirst = false; - return true; // start WaitForEndOfFrame - } - - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - return false; - } - - core.TrySetResult(null); - return false; - } - - public void Reset() - { - isFirst = true; - } - } - - sealed class DelayFramePromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode - { - static TaskPool pool; - DelayFramePromise nextNode; - public ref DelayFramePromise NextNode => ref nextNode; - - static DelayFramePromise() - { - TaskPool.RegisterSizeGetter(typeof(DelayFramePromise), () => pool.Size); - } - - int initialFrame; - int delayFrameCount; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - - int currentFrameCount; - UniTaskCompletionSourceCore core; - - DelayFramePromise() - { - } - - public static IUniTaskSource Create(int delayFrameCount, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new DelayFramePromise(); - } - - result.delayFrameCount = delayFrameCount; - result.cancellationToken = cancellationToken; - result.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1; - result.cancelImmediately = cancelImmediately; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var promise = (DelayFramePromise)state; - promise.core.TrySetCanceled(promise.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - token = result.core.Version; - return result; - } - - public void GetResult(short token) - { - try - { - core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - return false; - } - - if (currentFrameCount == 0) - { - if (delayFrameCount == 0) // same as Yield - { - core.TrySetResult(AsyncUnit.Default); - return false; - } - - // skip in initial frame. - if (initialFrame == Time.frameCount) - { -#if UNITY_EDITOR - // force use Realtime. - if (PlayerLoopHelper.IsMainThread && !UnityEditor.EditorApplication.isPlaying) - { - //goto ++currentFrameCount - } - else - { - return true; - } -#else - return true; -#endif - } - } - - if (++currentFrameCount >= delayFrameCount) - { - core.TrySetResult(AsyncUnit.Default); - return false; - } - - return true; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - currentFrameCount = default; - delayFrameCount = default; - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - cancelImmediately = default; - return pool.TryPush(this); - } - } - - sealed class DelayPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode - { - static TaskPool pool; - DelayPromise nextNode; - public ref DelayPromise NextNode => ref nextNode; - - static DelayPromise() - { - TaskPool.RegisterSizeGetter(typeof(DelayPromise), () => pool.Size); - } - - int initialFrame; - float delayTimeSpan; - float elapsed; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - - UniTaskCompletionSourceCore core; - - DelayPromise() - { - } - - public static IUniTaskSource Create(TimeSpan delayTimeSpan, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new DelayPromise(); - } - - result.elapsed = 0.0f; - result.delayTimeSpan = (float)delayTimeSpan.TotalSeconds; - result.cancellationToken = cancellationToken; - result.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1; - result.cancelImmediately = cancelImmediately; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var promise = (DelayPromise)state; - promise.core.TrySetCanceled(promise.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - token = result.core.Version; - return result; - } - - public void GetResult(short token) - { - try - { - core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - return false; - } - - if (elapsed == 0.0f) - { - if (initialFrame == Time.frameCount) - { - return true; - } - } - - elapsed += Time.deltaTime; - if (elapsed >= delayTimeSpan) - { - core.TrySetResult(null); - return false; - } - - return true; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - delayTimeSpan = default; - elapsed = default; - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - cancelImmediately = default; - return pool.TryPush(this); - } - } - - sealed class DelayIgnoreTimeScalePromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode - { - static TaskPool pool; - DelayIgnoreTimeScalePromise nextNode; - public ref DelayIgnoreTimeScalePromise NextNode => ref nextNode; - - static DelayIgnoreTimeScalePromise() - { - TaskPool.RegisterSizeGetter(typeof(DelayIgnoreTimeScalePromise), () => pool.Size); - } - - float delayFrameTimeSpan; - float elapsed; - int initialFrame; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - - UniTaskCompletionSourceCore core; - - DelayIgnoreTimeScalePromise() - { - } - - public static IUniTaskSource Create(TimeSpan delayFrameTimeSpan, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new DelayIgnoreTimeScalePromise(); - } - - result.elapsed = 0.0f; - result.delayFrameTimeSpan = (float)delayFrameTimeSpan.TotalSeconds; - result.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1; - result.cancellationToken = cancellationToken; - result.cancelImmediately = cancelImmediately; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var promise = (DelayIgnoreTimeScalePromise)state; - promise.core.TrySetCanceled(promise.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - token = result.core.Version; - return result; - } - - public void GetResult(short token) - { - try - { - core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - return false; - } - - if (elapsed == 0.0f) - { - if (initialFrame == Time.frameCount) - { - return true; - } - } - - elapsed += Time.unscaledDeltaTime; - if (elapsed >= delayFrameTimeSpan) - { - core.TrySetResult(null); - return false; - } - - return true; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - delayFrameTimeSpan = default; - elapsed = default; - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - cancelImmediately = default; - return pool.TryPush(this); - } - } - - sealed class DelayRealtimePromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode - { - static TaskPool pool; - DelayRealtimePromise nextNode; - public ref DelayRealtimePromise NextNode => ref nextNode; - - static DelayRealtimePromise() - { - TaskPool.RegisterSizeGetter(typeof(DelayRealtimePromise), () => pool.Size); - } - - long delayTimeSpanTicks; - ValueStopwatch stopwatch; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - - UniTaskCompletionSourceCore core; - - DelayRealtimePromise() - { - } - - public static IUniTaskSource Create(TimeSpan delayTimeSpan, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new DelayRealtimePromise(); - } - - result.stopwatch = ValueStopwatch.StartNew(); - result.delayTimeSpanTicks = delayTimeSpan.Ticks; - result.cancellationToken = cancellationToken; - result.cancelImmediately = cancelImmediately; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var promise = (DelayRealtimePromise)state; - promise.core.TrySetCanceled(promise.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - token = result.core.Version; - return result; - } - - public void GetResult(short token) - { - try - { - core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - return false; - } - - if (stopwatch.IsInvalid) - { - core.TrySetResult(AsyncUnit.Default); - return false; - } - - if (stopwatch.ElapsedTicks >= delayTimeSpanTicks) - { - core.TrySetResult(AsyncUnit.Default); - return false; - } - - return true; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - stopwatch = default; - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - cancelImmediately = default; - return pool.TryPush(this); - } - } - } - - public readonly struct YieldAwaitable - { - readonly PlayerLoopTiming timing; - - public YieldAwaitable(PlayerLoopTiming timing) - { - this.timing = timing; - } - - public Awaiter GetAwaiter() - { - return new Awaiter(timing); - } - - public UniTask ToUniTask() - { - return UniTask.Yield(timing, CancellationToken.None); - } - - public readonly struct Awaiter : ICriticalNotifyCompletion - { - readonly PlayerLoopTiming timing; - - public Awaiter(PlayerLoopTiming timing) - { - this.timing = timing; - } - - public bool IsCompleted => false; - - public void GetResult() { } - - public void OnCompleted(Action continuation) - { - PlayerLoopHelper.AddContinuation(timing, continuation); - } - - public void UnsafeOnCompleted(Action continuation) - { - PlayerLoopHelper.AddContinuation(timing, continuation); - } - } - } -} diff --git a/VirtueSky/UniTask/Runtime/UniTask.Delay.cs.meta b/VirtueSky/UniTask/Runtime/UniTask.Delay.cs.meta deleted file mode 100644 index 08ce5793..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.Delay.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ecff7972251de0848b2c0fa89bbd3489 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTask.Factory.cs b/VirtueSky/UniTask/Runtime/UniTask.Factory.cs deleted file mode 100644 index c4cffd65..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.Factory.cs +++ /dev/null @@ -1,533 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Runtime.CompilerServices; -using System.Runtime.ExceptionServices; -using System.Threading; - -namespace VirtueSky.Threading.Tasks -{ - public partial struct UniTask - { - static readonly UniTask CanceledUniTask = new Func(() => - { - return new UniTask(new CanceledResultSource(CancellationToken.None), 0); - })(); - - static class CanceledUniTaskCache - { - public static readonly UniTask Task; - - static CanceledUniTaskCache() - { - Task = new UniTask(new CanceledResultSource(CancellationToken.None), 0); - } - } - - public static readonly UniTask CompletedTask = new UniTask(); - - public static UniTask FromException(Exception ex) - { - if (ex is OperationCanceledException oce) - { - return FromCanceled(oce.CancellationToken); - } - - return new UniTask(new ExceptionResultSource(ex), 0); - } - - public static UniTask FromException(Exception ex) - { - if (ex is OperationCanceledException oce) - { - return FromCanceled(oce.CancellationToken); - } - - return new UniTask(new ExceptionResultSource(ex), 0); - } - - public static UniTask FromResult(T value) - { - return new UniTask(value); - } - - public static UniTask FromCanceled(CancellationToken cancellationToken = default) - { - if (cancellationToken == CancellationToken.None) - { - return CanceledUniTask; - } - else - { - return new UniTask(new CanceledResultSource(cancellationToken), 0); - } - } - - public static UniTask FromCanceled(CancellationToken cancellationToken = default) - { - if (cancellationToken == CancellationToken.None) - { - return CanceledUniTaskCache.Task; - } - else - { - return new UniTask(new CanceledResultSource(cancellationToken), 0); - } - } - - public static UniTask Create(Func factory) - { - return factory(); - } - - public static UniTask Create(Func factory, CancellationToken cancellationToken) - { - return factory(cancellationToken); - } - - public static UniTask Create(T state, Func factory) - { - return factory(state); - } - - public static UniTask Create(Func> factory) - { - return factory(); - } - - public static AsyncLazy Lazy(Func factory) - { - return new AsyncLazy(factory); - } - - public static AsyncLazy Lazy(Func> factory) - { - return new AsyncLazy(factory); - } - - /// - /// helper of fire and forget void action. - /// - public static void Void(Func asyncAction) - { - asyncAction().Forget(); - } - - /// - /// helper of fire and forget void action. - /// - public static void Void(Func asyncAction, CancellationToken cancellationToken) - { - asyncAction(cancellationToken).Forget(); - } - - /// - /// helper of fire and forget void action. - /// - public static void Void(Func asyncAction, T state) - { - asyncAction(state).Forget(); - } - - /// - /// helper of create add UniTaskVoid to delegate. - /// For example: FooAction = UniTask.Action(async () => { /* */ }) - /// - public static Action Action(Func asyncAction) - { - return () => asyncAction().Forget(); - } - - /// - /// helper of create add UniTaskVoid to delegate. - /// - public static Action Action(Func asyncAction, - CancellationToken cancellationToken) - { - return () => asyncAction(cancellationToken).Forget(); - } - - /// - /// helper of create add UniTaskVoid to delegate. - /// - public static Action Action(T state, Func asyncAction) - { - return () => asyncAction(state).Forget(); - } - -#if UNITY_2018_3_OR_NEWER - - /// - /// Create async void(UniTaskVoid) UnityAction. - /// For example: onClick.AddListener(UniTask.UnityAction(async () => { /* */ } )) - /// - public static UnityEngine.Events.UnityAction UnityAction(Func asyncAction) - { - return () => asyncAction().Forget(); - } - - /// - /// Create async void(UniTaskVoid) UnityAction. - /// For example: onClick.AddListener(UniTask.UnityAction(FooAsync, this.GetCancellationTokenOnDestroy())) - /// - public static UnityEngine.Events.UnityAction UnityAction(Func asyncAction, - CancellationToken cancellationToken) - { - return () => asyncAction(cancellationToken).Forget(); - } - - /// - /// Create async void(UniTaskVoid) UnityAction. - /// For example: onClick.AddListener(UniTask.UnityAction(FooAsync, Argument)) - /// - public static UnityEngine.Events.UnityAction UnityAction(T state, Func asyncAction) - { - return () => asyncAction(state).Forget(); - } - -#endif - - /// - /// Defer the task creation just before call await. - /// - public static UniTask Defer(Func factory) - { - return new UniTask(new DeferPromise(factory), 0); - } - - /// - /// Defer the task creation just before call await. - /// - public static UniTask Defer(Func> factory) - { - return new UniTask(new DeferPromise(factory), 0); - } - - /// - /// Never complete. - /// - public static UniTask Never(CancellationToken cancellationToken) - { - return new UniTask(new NeverPromise(cancellationToken), 0); - } - - /// - /// Never complete. - /// - public static UniTask Never(CancellationToken cancellationToken) - { - return new UniTask(new NeverPromise(cancellationToken), 0); - } - - sealed class ExceptionResultSource : IUniTaskSource - { - readonly ExceptionDispatchInfo exception; - bool calledGet; - - public ExceptionResultSource(Exception exception) - { - this.exception = ExceptionDispatchInfo.Capture(exception); - } - - public void GetResult(short token) - { - if (!calledGet) - { - calledGet = true; - GC.SuppressFinalize(this); - } - - exception.Throw(); - } - - public UniTaskStatus GetStatus(short token) - { - return UniTaskStatus.Faulted; - } - - public UniTaskStatus UnsafeGetStatus() - { - return UniTaskStatus.Faulted; - } - - public void OnCompleted(Action continuation, object state, short token) - { - continuation(state); - } - - ~ExceptionResultSource() - { - if (!calledGet) - { - UniTaskScheduler.PublishUnobservedTaskException(exception.SourceException); - } - } - } - - sealed class ExceptionResultSource : IUniTaskSource - { - readonly ExceptionDispatchInfo exception; - bool calledGet; - - public ExceptionResultSource(Exception exception) - { - this.exception = ExceptionDispatchInfo.Capture(exception); - } - - public T GetResult(short token) - { - if (!calledGet) - { - calledGet = true; - GC.SuppressFinalize(this); - } - - exception.Throw(); - return default; - } - - void IUniTaskSource.GetResult(short token) - { - if (!calledGet) - { - calledGet = true; - GC.SuppressFinalize(this); - } - - exception.Throw(); - } - - public UniTaskStatus GetStatus(short token) - { - return UniTaskStatus.Faulted; - } - - public UniTaskStatus UnsafeGetStatus() - { - return UniTaskStatus.Faulted; - } - - public void OnCompleted(Action continuation, object state, short token) - { - continuation(state); - } - - ~ExceptionResultSource() - { - if (!calledGet) - { - UniTaskScheduler.PublishUnobservedTaskException(exception.SourceException); - } - } - } - - sealed class CanceledResultSource : IUniTaskSource - { - readonly CancellationToken cancellationToken; - - public CanceledResultSource(CancellationToken cancellationToken) - { - this.cancellationToken = cancellationToken; - } - - public void GetResult(short token) - { - throw new OperationCanceledException(cancellationToken); - } - - public UniTaskStatus GetStatus(short token) - { - return UniTaskStatus.Canceled; - } - - public UniTaskStatus UnsafeGetStatus() - { - return UniTaskStatus.Canceled; - } - - public void OnCompleted(Action continuation, object state, short token) - { - continuation(state); - } - } - - sealed class CanceledResultSource : IUniTaskSource - { - readonly CancellationToken cancellationToken; - - public CanceledResultSource(CancellationToken cancellationToken) - { - this.cancellationToken = cancellationToken; - } - - public T GetResult(short token) - { - throw new OperationCanceledException(cancellationToken); - } - - void IUniTaskSource.GetResult(short token) - { - throw new OperationCanceledException(cancellationToken); - } - - public UniTaskStatus GetStatus(short token) - { - return UniTaskStatus.Canceled; - } - - public UniTaskStatus UnsafeGetStatus() - { - return UniTaskStatus.Canceled; - } - - public void OnCompleted(Action continuation, object state, short token) - { - continuation(state); - } - } - - sealed class DeferPromise : IUniTaskSource - { - Func factory; - UniTask task; - UniTask.Awaiter awaiter; - - public DeferPromise(Func factory) - { - this.factory = factory; - } - - public void GetResult(short token) - { - awaiter.GetResult(); - } - - public UniTaskStatus GetStatus(short token) - { - var f = Interlocked.Exchange(ref factory, null); - if (f != null) - { - task = f(); - awaiter = task.GetAwaiter(); - } - - return task.Status; - } - - public void OnCompleted(Action continuation, object state, short token) - { - awaiter.SourceOnCompleted(continuation, state); - } - - public UniTaskStatus UnsafeGetStatus() - { - return task.Status; - } - } - - sealed class DeferPromise : IUniTaskSource - { - Func> factory; - UniTask task; - UniTask.Awaiter awaiter; - - public DeferPromise(Func> factory) - { - this.factory = factory; - } - - public T GetResult(short token) - { - return awaiter.GetResult(); - } - - void IUniTaskSource.GetResult(short token) - { - awaiter.GetResult(); - } - - public UniTaskStatus GetStatus(short token) - { - var f = Interlocked.Exchange(ref factory, null); - if (f != null) - { - task = f(); - awaiter = task.GetAwaiter(); - } - - return task.Status; - } - - public void OnCompleted(Action continuation, object state, short token) - { - awaiter.SourceOnCompleted(continuation, state); - } - - public UniTaskStatus UnsafeGetStatus() - { - return task.Status; - } - } - - sealed class NeverPromise : IUniTaskSource - { - static readonly Action cancellationCallback = CancellationCallback; - - CancellationToken cancellationToken; - UniTaskCompletionSourceCore core; - - public NeverPromise(CancellationToken cancellationToken) - { - this.cancellationToken = cancellationToken; - if (this.cancellationToken.CanBeCanceled) - { - this.cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, this); - } - } - - static void CancellationCallback(object state) - { - var self = (NeverPromise)state; - self.core.TrySetCanceled(self.cancellationToken); - } - - public T GetResult(short token) - { - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - void IUniTaskSource.GetResult(short token) - { - core.GetResult(token); - } - } - } - - internal static class CompletedTasks - { - public static readonly UniTask AsyncUnit = - UniTask.FromResult(VirtueSky.Threading.Tasks.AsyncUnit.Default); - - public static readonly UniTask True = UniTask.FromResult(true); - public static readonly UniTask False = UniTask.FromResult(false); - public static readonly UniTask Zero = UniTask.FromResult(0); - public static readonly UniTask MinusOne = UniTask.FromResult(-1); - public static readonly UniTask One = UniTask.FromResult(1); - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/UniTask.Factory.cs.meta b/VirtueSky/UniTask/Runtime/UniTask.Factory.cs.meta deleted file mode 100644 index 31bc0c95..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.Factory.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4e12b66d6b9bd7845b04a594cbe386b4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTask.Run.cs b/VirtueSky/UniTask/Runtime/UniTask.Run.cs deleted file mode 100644 index 43748713..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.Run.cs +++ /dev/null @@ -1,289 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks -{ - public partial struct UniTask - { - #region OBSOLETE_RUN - - [Obsolete("UniTask.Run is similar as Task.Run, it uses ThreadPool. For equivalent behaviour, use UniTask.RunOnThreadPool instead. If you don't want to use ThreadPool, you can use UniTask.Void(async void) or UniTask.Create(async UniTask) too.")] - public static UniTask Run(Action action, bool configureAwait = true, CancellationToken cancellationToken = default) - { - return RunOnThreadPool(action, configureAwait, cancellationToken); - } - - [Obsolete("UniTask.Run is similar as Task.Run, it uses ThreadPool. For equivalent behaviour, use UniTask.RunOnThreadPool instead. If you don't want to use ThreadPool, you can use UniTask.Void(async void) or UniTask.Create(async UniTask) too.")] - public static UniTask Run(Action action, object state, bool configureAwait = true, CancellationToken cancellationToken = default) - { - return RunOnThreadPool(action, state, configureAwait, cancellationToken); - } - - [Obsolete("UniTask.Run is similar as Task.Run, it uses ThreadPool. For equivalent behaviour, use UniTask.RunOnThreadPool instead. If you don't want to use ThreadPool, you can use UniTask.Void(async void) or UniTask.Create(async UniTask) too.")] - public static UniTask Run(Func action, bool configureAwait = true, CancellationToken cancellationToken = default) - { - return RunOnThreadPool(action, configureAwait, cancellationToken); - } - - [Obsolete("UniTask.Run is similar as Task.Run, it uses ThreadPool. For equivalent behaviour, use UniTask.RunOnThreadPool instead. If you don't want to use ThreadPool, you can use UniTask.Void(async void) or UniTask.Create(async UniTask) too.")] - public static UniTask Run(Func action, object state, bool configureAwait = true, CancellationToken cancellationToken = default) - { - return RunOnThreadPool(action, state, configureAwait, cancellationToken); - } - - [Obsolete("UniTask.Run is similar as Task.Run, it uses ThreadPool. For equivalent behaviour, use UniTask.RunOnThreadPool instead. If you don't want to use ThreadPool, you can use UniTask.Void(async void) or UniTask.Create(async UniTask) too.")] - public static UniTask Run(Func func, bool configureAwait = true, CancellationToken cancellationToken = default) - { - return RunOnThreadPool(func, configureAwait, cancellationToken); - } - - [Obsolete("UniTask.Run is similar as Task.Run, it uses ThreadPool. For equivalent behaviour, use UniTask.RunOnThreadPool instead. If you don't want to use ThreadPool, you can use UniTask.Void(async void) or UniTask.Create(async UniTask) too.")] - public static UniTask Run(Func> func, bool configureAwait = true, CancellationToken cancellationToken = default) - { - return RunOnThreadPool(func, configureAwait, cancellationToken); - } - - [Obsolete("UniTask.Run is similar as Task.Run, it uses ThreadPool. For equivalent behaviour, use UniTask.RunOnThreadPool instead. If you don't want to use ThreadPool, you can use UniTask.Void(async void) or UniTask.Create(async UniTask) too.")] - public static UniTask Run(Func func, object state, bool configureAwait = true, CancellationToken cancellationToken = default) - { - return RunOnThreadPool(func, state, configureAwait, cancellationToken); - } - - [Obsolete("UniTask.Run is similar as Task.Run, it uses ThreadPool. For equivalent behaviour, use UniTask.RunOnThreadPool instead. If you don't want to use ThreadPool, you can use UniTask.Void(async void) or UniTask.Create(async UniTask) too.")] - public static UniTask Run(Func> func, object state, bool configureAwait = true, CancellationToken cancellationToken = default) - { - return RunOnThreadPool(func, state, configureAwait, cancellationToken); - } - - #endregion - - /// Run action on the threadPool and return to main thread if configureAwait = true. - public static async UniTask RunOnThreadPool(Action action, bool configureAwait = true, CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - await UniTask.SwitchToThreadPool(); - - cancellationToken.ThrowIfCancellationRequested(); - - if (configureAwait) - { - try - { - action(); - } - finally - { - await UniTask.Yield(); - } - } - else - { - action(); - } - - cancellationToken.ThrowIfCancellationRequested(); - } - - /// Run action on the threadPool and return to main thread if configureAwait = true. - public static async UniTask RunOnThreadPool(Action action, object state, bool configureAwait = true, CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - await UniTask.SwitchToThreadPool(); - - cancellationToken.ThrowIfCancellationRequested(); - - if (configureAwait) - { - try - { - action(state); - } - finally - { - await UniTask.Yield(); - } - } - else - { - action(state); - } - - cancellationToken.ThrowIfCancellationRequested(); - } - - /// Run action on the threadPool and return to main thread if configureAwait = true. - public static async UniTask RunOnThreadPool(Func action, bool configureAwait = true, CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - await UniTask.SwitchToThreadPool(); - - cancellationToken.ThrowIfCancellationRequested(); - - if (configureAwait) - { - try - { - await action(); - } - finally - { - await UniTask.Yield(); - } - } - else - { - await action(); - } - - cancellationToken.ThrowIfCancellationRequested(); - } - - /// Run action on the threadPool and return to main thread if configureAwait = true. - public static async UniTask RunOnThreadPool(Func action, object state, bool configureAwait = true, CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - await UniTask.SwitchToThreadPool(); - - cancellationToken.ThrowIfCancellationRequested(); - - if (configureAwait) - { - try - { - await action(state); - } - finally - { - await UniTask.Yield(); - } - } - else - { - await action(state); - } - - cancellationToken.ThrowIfCancellationRequested(); - } - - /// Run action on the threadPool and return to main thread if configureAwait = true. - public static async UniTask RunOnThreadPool(Func func, bool configureAwait = true, CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - await UniTask.SwitchToThreadPool(); - - cancellationToken.ThrowIfCancellationRequested(); - - if (configureAwait) - { - try - { - return func(); - } - finally - { - await UniTask.Yield(); - cancellationToken.ThrowIfCancellationRequested(); - } - } - else - { - return func(); - } - } - - /// Run action on the threadPool and return to main thread if configureAwait = true. - public static async UniTask RunOnThreadPool(Func> func, bool configureAwait = true, CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - await UniTask.SwitchToThreadPool(); - - cancellationToken.ThrowIfCancellationRequested(); - - if (configureAwait) - { - try - { - return await func(); - } - finally - { - cancellationToken.ThrowIfCancellationRequested(); - await UniTask.Yield(); - cancellationToken.ThrowIfCancellationRequested(); - } - } - else - { - var result = await func(); - cancellationToken.ThrowIfCancellationRequested(); - return result; - } - } - - /// Run action on the threadPool and return to main thread if configureAwait = true. - public static async UniTask RunOnThreadPool(Func func, object state, bool configureAwait = true, CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - await UniTask.SwitchToThreadPool(); - - cancellationToken.ThrowIfCancellationRequested(); - - if (configureAwait) - { - try - { - return func(state); - } - finally - { - await UniTask.Yield(); - cancellationToken.ThrowIfCancellationRequested(); - } - } - else - { - return func(state); - } - } - - /// Run action on the threadPool and return to main thread if configureAwait = true. - public static async UniTask RunOnThreadPool(Func> func, object state, bool configureAwait = true, CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - await UniTask.SwitchToThreadPool(); - - cancellationToken.ThrowIfCancellationRequested(); - - if (configureAwait) - { - try - { - return await func(state); - } - finally - { - cancellationToken.ThrowIfCancellationRequested(); - await UniTask.Yield(); - cancellationToken.ThrowIfCancellationRequested(); - } - } - else - { - var result = await func(state); - cancellationToken.ThrowIfCancellationRequested(); - return result; - } - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/UniTask.Run.cs.meta b/VirtueSky/UniTask/Runtime/UniTask.Run.cs.meta deleted file mode 100644 index 9a780aea..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.Run.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8473162fc285a5f44bcca90f7da073e7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTask.Threading.cs b/VirtueSky/UniTask/Runtime/UniTask.Threading.cs deleted file mode 100644 index 347ff6b4..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.Threading.cs +++ /dev/null @@ -1,412 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Runtime.CompilerServices; -using System.Threading; -using System.Threading.Tasks; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks -{ - public partial struct UniTask - { -#if UNITY_2018_3_OR_NEWER - - /// - /// If running on mainthread, do nothing. Otherwise, same as UniTask.Yield(PlayerLoopTiming.Update). - /// - public static SwitchToMainThreadAwaitable SwitchToMainThread(CancellationToken cancellationToken = default) - { - return new SwitchToMainThreadAwaitable(PlayerLoopTiming.Update, cancellationToken); - } - - /// - /// If running on mainthread, do nothing. Otherwise, same as UniTask.Yield(timing). - /// - public static SwitchToMainThreadAwaitable SwitchToMainThread(PlayerLoopTiming timing, CancellationToken cancellationToken = default) - { - return new SwitchToMainThreadAwaitable(timing, cancellationToken); - } - - /// - /// Return to mainthread(same as await SwitchToMainThread) after using scope is closed. - /// - public static ReturnToMainThread ReturnToMainThread(CancellationToken cancellationToken = default) - { - return new ReturnToMainThread(PlayerLoopTiming.Update, cancellationToken); - } - - /// - /// Return to mainthread(same as await SwitchToMainThread) after using scope is closed. - /// - public static ReturnToMainThread ReturnToMainThread(PlayerLoopTiming timing, CancellationToken cancellationToken = default) - { - return new ReturnToMainThread(timing, cancellationToken); - } - - /// - /// Queue the action to PlayerLoop. - /// - public static void Post(Action action, PlayerLoopTiming timing = PlayerLoopTiming.Update) - { - PlayerLoopHelper.AddContinuation(timing, action); - } - -#endif - - public static SwitchToThreadPoolAwaitable SwitchToThreadPool() - { - return new SwitchToThreadPoolAwaitable(); - } - - /// - /// Note: use SwitchToThreadPool is recommended. - /// - public static SwitchToTaskPoolAwaitable SwitchToTaskPool() - { - return new SwitchToTaskPoolAwaitable(); - } - - public static SwitchToSynchronizationContextAwaitable SwitchToSynchronizationContext(SynchronizationContext synchronizationContext, CancellationToken cancellationToken = default) - { - Error.ThrowArgumentNullException(synchronizationContext, nameof(synchronizationContext)); - return new SwitchToSynchronizationContextAwaitable(synchronizationContext, cancellationToken); - } - - public static ReturnToSynchronizationContext ReturnToSynchronizationContext(SynchronizationContext synchronizationContext, CancellationToken cancellationToken = default) - { - return new ReturnToSynchronizationContext(synchronizationContext, false, cancellationToken); - } - - public static ReturnToSynchronizationContext ReturnToCurrentSynchronizationContext(bool dontPostWhenSameContext = true, CancellationToken cancellationToken = default) - { - return new ReturnToSynchronizationContext(SynchronizationContext.Current, dontPostWhenSameContext, cancellationToken); - } - } - -#if UNITY_2018_3_OR_NEWER - - public struct SwitchToMainThreadAwaitable - { - readonly PlayerLoopTiming playerLoopTiming; - readonly CancellationToken cancellationToken; - - public SwitchToMainThreadAwaitable(PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken) - { - this.playerLoopTiming = playerLoopTiming; - this.cancellationToken = cancellationToken; - } - - public Awaiter GetAwaiter() => new Awaiter(playerLoopTiming, cancellationToken); - - public struct Awaiter : ICriticalNotifyCompletion - { - readonly PlayerLoopTiming playerLoopTiming; - readonly CancellationToken cancellationToken; - - public Awaiter(PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken) - { - this.playerLoopTiming = playerLoopTiming; - this.cancellationToken = cancellationToken; - } - - public bool IsCompleted - { - get - { - var currentThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId; - if (PlayerLoopHelper.MainThreadId == currentThreadId) - { - return true; // run immediate. - } - else - { - return false; // register continuation. - } - } - } - - public void GetResult() { cancellationToken.ThrowIfCancellationRequested(); } - - public void OnCompleted(Action continuation) - { - PlayerLoopHelper.AddContinuation(playerLoopTiming, continuation); - } - - public void UnsafeOnCompleted(Action continuation) - { - PlayerLoopHelper.AddContinuation(playerLoopTiming, continuation); - } - } - } - - public struct ReturnToMainThread - { - readonly PlayerLoopTiming playerLoopTiming; - readonly CancellationToken cancellationToken; - - public ReturnToMainThread(PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken) - { - this.playerLoopTiming = playerLoopTiming; - this.cancellationToken = cancellationToken; - } - - public Awaiter DisposeAsync() - { - return new Awaiter(playerLoopTiming, cancellationToken); // run immediate. - } - - public readonly struct Awaiter : ICriticalNotifyCompletion - { - readonly PlayerLoopTiming timing; - readonly CancellationToken cancellationToken; - - public Awaiter(PlayerLoopTiming timing, CancellationToken cancellationToken) - { - this.timing = timing; - this.cancellationToken = cancellationToken; - } - - public Awaiter GetAwaiter() => this; - - public bool IsCompleted => PlayerLoopHelper.MainThreadId == System.Threading.Thread.CurrentThread.ManagedThreadId; - - public void GetResult() { cancellationToken.ThrowIfCancellationRequested(); } - - public void OnCompleted(Action continuation) - { - PlayerLoopHelper.AddContinuation(timing, continuation); - } - - public void UnsafeOnCompleted(Action continuation) - { - PlayerLoopHelper.AddContinuation(timing, continuation); - } - } - } - -#endif - - public struct SwitchToThreadPoolAwaitable - { - public Awaiter GetAwaiter() => new Awaiter(); - - public struct Awaiter : ICriticalNotifyCompletion - { - static readonly WaitCallback switchToCallback = Callback; - - public bool IsCompleted => false; - public void GetResult() { } - - public void OnCompleted(Action continuation) - { - ThreadPool.QueueUserWorkItem(switchToCallback, continuation); - } - - public void UnsafeOnCompleted(Action continuation) - { -#if NETCOREAPP3_1 - ThreadPool.UnsafeQueueUserWorkItem(ThreadPoolWorkItem.Create(continuation), false); -#else - ThreadPool.UnsafeQueueUserWorkItem(switchToCallback, continuation); -#endif - } - - static void Callback(object state) - { - var continuation = (Action)state; - continuation(); - } - } - -#if NETCOREAPP3_1 - - sealed class ThreadPoolWorkItem : IThreadPoolWorkItem, ITaskPoolNode - { - static TaskPool pool; - ThreadPoolWorkItem nextNode; - public ref ThreadPoolWorkItem NextNode => ref nextNode; - - static ThreadPoolWorkItem() - { - TaskPool.RegisterSizeGetter(typeof(ThreadPoolWorkItem), () => pool.Size); - } - - Action continuation; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ThreadPoolWorkItem Create(Action continuation) - { - if (!pool.TryPop(out var item)) - { - item = new ThreadPoolWorkItem(); - } - - item.continuation = continuation; - return item; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void Execute() - { - var call = continuation; - continuation = null; - if (call != null) - { - pool.TryPush(this); - call.Invoke(); - } - } - } - -#endif - } - - public struct SwitchToTaskPoolAwaitable - { - public Awaiter GetAwaiter() => new Awaiter(); - - public struct Awaiter : ICriticalNotifyCompletion - { - static readonly Action switchToCallback = Callback; - - public bool IsCompleted => false; - public void GetResult() { } - - public void OnCompleted(Action continuation) - { - Task.Factory.StartNew(switchToCallback, continuation, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default); - } - - public void UnsafeOnCompleted(Action continuation) - { - Task.Factory.StartNew(switchToCallback, continuation, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default); - } - - static void Callback(object state) - { - var continuation = (Action)state; - continuation(); - } - } - } - - public struct SwitchToSynchronizationContextAwaitable - { - readonly SynchronizationContext synchronizationContext; - readonly CancellationToken cancellationToken; - - public SwitchToSynchronizationContextAwaitable(SynchronizationContext synchronizationContext, CancellationToken cancellationToken) - { - this.synchronizationContext = synchronizationContext; - this.cancellationToken = cancellationToken; - } - - public Awaiter GetAwaiter() => new Awaiter(synchronizationContext, cancellationToken); - - public struct Awaiter : ICriticalNotifyCompletion - { - static readonly SendOrPostCallback switchToCallback = Callback; - readonly SynchronizationContext synchronizationContext; - readonly CancellationToken cancellationToken; - - public Awaiter(SynchronizationContext synchronizationContext, CancellationToken cancellationToken) - { - this.synchronizationContext = synchronizationContext; - this.cancellationToken = cancellationToken; - } - - public bool IsCompleted => false; - public void GetResult() { cancellationToken.ThrowIfCancellationRequested(); } - - public void OnCompleted(Action continuation) - { - synchronizationContext.Post(switchToCallback, continuation); - } - - public void UnsafeOnCompleted(Action continuation) - { - synchronizationContext.Post(switchToCallback, continuation); - } - - static void Callback(object state) - { - var continuation = (Action)state; - continuation(); - } - } - } - - public struct ReturnToSynchronizationContext - { - readonly SynchronizationContext syncContext; - readonly bool dontPostWhenSameContext; - readonly CancellationToken cancellationToken; - - public ReturnToSynchronizationContext(SynchronizationContext syncContext, bool dontPostWhenSameContext, CancellationToken cancellationToken) - { - this.syncContext = syncContext; - this.dontPostWhenSameContext = dontPostWhenSameContext; - this.cancellationToken = cancellationToken; - } - - public Awaiter DisposeAsync() - { - return new Awaiter(syncContext, dontPostWhenSameContext, cancellationToken); - } - - public struct Awaiter : ICriticalNotifyCompletion - { - static readonly SendOrPostCallback switchToCallback = Callback; - - readonly SynchronizationContext synchronizationContext; - readonly bool dontPostWhenSameContext; - readonly CancellationToken cancellationToken; - - public Awaiter(SynchronizationContext synchronizationContext, bool dontPostWhenSameContext, CancellationToken cancellationToken) - { - this.synchronizationContext = synchronizationContext; - this.dontPostWhenSameContext = dontPostWhenSameContext; - this.cancellationToken = cancellationToken; - } - - public Awaiter GetAwaiter() => this; - - public bool IsCompleted - { - get - { - if (!dontPostWhenSameContext) return false; - - var current = SynchronizationContext.Current; - if (current == synchronizationContext) - { - return true; - } - else - { - return false; - } - } - } - - public void GetResult() { cancellationToken.ThrowIfCancellationRequested(); } - - public void OnCompleted(Action continuation) - { - synchronizationContext.Post(switchToCallback, continuation); - } - - public void UnsafeOnCompleted(Action continuation) - { - synchronizationContext.Post(switchToCallback, continuation); - } - - static void Callback(object state) - { - var continuation = (Action)state; - continuation(); - } - } - } -} diff --git a/VirtueSky/UniTask/Runtime/UniTask.Threading.cs.meta b/VirtueSky/UniTask/Runtime/UniTask.Threading.cs.meta deleted file mode 100644 index fa512b8c..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.Threading.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4132ea600454134439fa2c7eb931b5e6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTask.WaitUntil.cs b/VirtueSky/UniTask/Runtime/UniTask.WaitUntil.cs deleted file mode 100644 index 4e787392..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.WaitUntil.cs +++ /dev/null @@ -1,666 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Collections.Generic; -using System.Threading; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks -{ - public partial struct UniTask - { - public static UniTask WaitUntil(Func predicate, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) - { - return new UniTask(WaitUntilPromise.Create(predicate, timing, cancellationToken, cancelImmediately, out var token), token); - } - - public static UniTask WaitWhile(Func predicate, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) - { - return new UniTask(WaitWhilePromise.Create(predicate, timing, cancellationToken, cancelImmediately, out var token), token); - } - - public static UniTask WaitUntilCanceled(CancellationToken cancellationToken, PlayerLoopTiming timing = PlayerLoopTiming.Update, bool completeImmediately = false) - { - return new UniTask(WaitUntilCanceledPromise.Create(cancellationToken, timing, completeImmediately, out var token), token); - } - - public static UniTask WaitUntilValueChanged(T target, Func monitorFunction, PlayerLoopTiming monitorTiming = PlayerLoopTiming.Update, IEqualityComparer equalityComparer = null, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) - where T : class - { - var unityObject = target as UnityEngine.Object; - var isUnityObject = target is UnityEngine.Object; // don't use (unityObject == null) - - return new UniTask(isUnityObject - ? WaitUntilValueChangedUnityObjectPromise.Create(target, monitorFunction, equalityComparer, monitorTiming, cancellationToken, cancelImmediately, out var token) - : WaitUntilValueChangedStandardObjectPromise.Create(target, monitorFunction, equalityComparer, monitorTiming, cancellationToken, cancelImmediately, out token), token); - } - - sealed class WaitUntilPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode - { - static TaskPool pool; - WaitUntilPromise nextNode; - public ref WaitUntilPromise NextNode => ref nextNode; - - static WaitUntilPromise() - { - TaskPool.RegisterSizeGetter(typeof(WaitUntilPromise), () => pool.Size); - } - - Func predicate; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - - UniTaskCompletionSourceCore core; - - WaitUntilPromise() - { - } - - public static IUniTaskSource Create(Func predicate, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new WaitUntilPromise(); - } - - result.predicate = predicate; - result.cancellationToken = cancellationToken; - result.cancelImmediately = cancelImmediately; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var promise = (WaitUntilPromise)state; - promise.core.TrySetCanceled(promise.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - token = result.core.Version; - return result; - } - - public void GetResult(short token) - { - try - { - core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - return false; - } - - try - { - if (!predicate()) - { - return true; - } - } - catch (Exception ex) - { - core.TrySetException(ex); - return false; - } - - core.TrySetResult(null); - return false; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - predicate = default; - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - cancelImmediately = default; - return pool.TryPush(this); - } - } - - sealed class WaitWhilePromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode - { - static TaskPool pool; - WaitWhilePromise nextNode; - public ref WaitWhilePromise NextNode => ref nextNode; - - static WaitWhilePromise() - { - TaskPool.RegisterSizeGetter(typeof(WaitWhilePromise), () => pool.Size); - } - - Func predicate; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - - UniTaskCompletionSourceCore core; - - WaitWhilePromise() - { - } - - public static IUniTaskSource Create(Func predicate, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new WaitWhilePromise(); - } - - result.predicate = predicate; - result.cancellationToken = cancellationToken; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var promise = (WaitWhilePromise)state; - promise.core.TrySetCanceled(promise.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - token = result.core.Version; - return result; - } - - public void GetResult(short token) - { - try - { - core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - return false; - } - - try - { - if (predicate()) - { - return true; - } - } - catch (Exception ex) - { - core.TrySetException(ex); - return false; - } - - core.TrySetResult(null); - return false; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - predicate = default; - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - cancelImmediately = default; - return pool.TryPush(this); - } - } - - sealed class WaitUntilCanceledPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode - { - static TaskPool pool; - WaitUntilCanceledPromise nextNode; - public ref WaitUntilCanceledPromise NextNode => ref nextNode; - - static WaitUntilCanceledPromise() - { - TaskPool.RegisterSizeGetter(typeof(WaitUntilCanceledPromise), () => pool.Size); - } - - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - - UniTaskCompletionSourceCore core; - - WaitUntilCanceledPromise() - { - } - - public static IUniTaskSource Create(CancellationToken cancellationToken, PlayerLoopTiming timing, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new WaitUntilCanceledPromise(); - } - - result.cancellationToken = cancellationToken; - result.cancelImmediately = cancelImmediately; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var promise = (WaitUntilCanceledPromise)state; - promise.core.TrySetResult(null); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - token = result.core.Version; - return result; - } - - public void GetResult(short token) - { - try - { - core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - if (cancellationToken.IsCancellationRequested) - { - core.TrySetResult(null); - return false; - } - - return true; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - cancelImmediately = default; - return pool.TryPush(this); - } - } - - // where T : UnityEngine.Object, can not add constraint - sealed class WaitUntilValueChangedUnityObjectPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode> - { - static TaskPool> pool; - WaitUntilValueChangedUnityObjectPromise nextNode; - public ref WaitUntilValueChangedUnityObjectPromise NextNode => ref nextNode; - - static WaitUntilValueChangedUnityObjectPromise() - { - TaskPool.RegisterSizeGetter(typeof(WaitUntilValueChangedUnityObjectPromise), () => pool.Size); - } - - T target; - UnityEngine.Object targetAsUnityObject; - U currentValue; - Func monitorFunction; - IEqualityComparer equalityComparer; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - - UniTaskCompletionSourceCore core; - - WaitUntilValueChangedUnityObjectPromise() - { - } - - public static IUniTaskSource Create(T target, Func monitorFunction, IEqualityComparer equalityComparer, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new WaitUntilValueChangedUnityObjectPromise(); - } - - result.target = target; - result.targetAsUnityObject = target as UnityEngine.Object; - result.monitorFunction = monitorFunction; - result.currentValue = monitorFunction(target); - result.equalityComparer = equalityComparer ?? UnityEqualityComparer.GetDefault(); - result.cancellationToken = cancellationToken; - result.cancelImmediately = cancelImmediately; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var promise = (WaitUntilValueChangedUnityObjectPromise)state; - promise.core.TrySetCanceled(promise.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - token = result.core.Version; - return result; - } - - public U GetResult(short token) - { - try - { - return core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - if (cancellationToken.IsCancellationRequested || targetAsUnityObject == null) // destroyed = cancel. - { - core.TrySetCanceled(cancellationToken); - return false; - } - - U nextValue = default(U); - try - { - nextValue = monitorFunction(target); - if (equalityComparer.Equals(currentValue, nextValue)) - { - return true; - } - } - catch (Exception ex) - { - core.TrySetException(ex); - return false; - } - - core.TrySetResult(nextValue); - return false; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - target = default; - currentValue = default; - monitorFunction = default; - equalityComparer = default; - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - cancelImmediately = default; - return pool.TryPush(this); - } - } - - sealed class WaitUntilValueChangedStandardObjectPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode> - where T : class - { - static TaskPool> pool; - WaitUntilValueChangedStandardObjectPromise nextNode; - public ref WaitUntilValueChangedStandardObjectPromise NextNode => ref nextNode; - - static WaitUntilValueChangedStandardObjectPromise() - { - TaskPool.RegisterSizeGetter(typeof(WaitUntilValueChangedStandardObjectPromise), () => pool.Size); - } - - WeakReference target; - U currentValue; - Func monitorFunction; - IEqualityComparer equalityComparer; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - - UniTaskCompletionSourceCore core; - - WaitUntilValueChangedStandardObjectPromise() - { - } - - public static IUniTaskSource Create(T target, Func monitorFunction, IEqualityComparer equalityComparer, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new WaitUntilValueChangedStandardObjectPromise(); - } - - result.target = new WeakReference(target, false); // wrap in WeakReference. - result.monitorFunction = monitorFunction; - result.currentValue = monitorFunction(target); - result.equalityComparer = equalityComparer ?? UnityEqualityComparer.GetDefault(); - result.cancellationToken = cancellationToken; - result.cancelImmediately = cancelImmediately; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var promise = (WaitUntilValueChangedStandardObjectPromise)state; - promise.core.TrySetCanceled(promise.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - token = result.core.Version; - return result; - } - - public U GetResult(short token) - { - try - { - return core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - if (cancellationToken.IsCancellationRequested || !target.TryGetTarget(out var t)) // doesn't find = cancel. - { - core.TrySetCanceled(cancellationToken); - return false; - } - - U nextValue = default(U); - try - { - nextValue = monitorFunction(t); - if (equalityComparer.Equals(currentValue, nextValue)) - { - return true; - } - } - catch (Exception ex) - { - core.TrySetException(ex); - return false; - } - - core.TrySetResult(nextValue); - return false; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - target = default; - currentValue = default; - monitorFunction = default; - equalityComparer = default; - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - cancelImmediately = default; - return pool.TryPush(this); - } - } - } -} diff --git a/VirtueSky/UniTask/Runtime/UniTask.WaitUntil.cs.meta b/VirtueSky/UniTask/Runtime/UniTask.WaitUntil.cs.meta deleted file mode 100644 index 6e64dc7e..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.WaitUntil.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 87c9c533491903a4288536b5ac173db8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTask.WhenAll.Generated.cs b/VirtueSky/UniTask/Runtime/UniTask.WhenAll.Generated.cs deleted file mode 100644 index df43ec57..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.WhenAll.Generated.cs +++ /dev/null @@ -1,5011 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -using System; -using System.Runtime.CompilerServices; -using System.Runtime.ExceptionServices; -using System.Threading; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks -{ - public partial struct UniTask - { - - public static UniTask<(T1, T2)> WhenAll(UniTask task1, UniTask task2) - { - if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully()) - { - return new UniTask<(T1, T2)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult())); - } - - return new UniTask<(T1, T2)>(new WhenAllPromise(task1, task2), 0); - } - - sealed class WhenAllPromise : IUniTaskSource<(T1, T2)> - { - T1 t1 = default; - T2 t2 = default; - int completedCount; - UniTaskCompletionSourceCore<(T1, T2)> core; - - public WhenAllPromise(UniTask task1, UniTask task2) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t1 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 2) - { - self.core.TrySetResult((self.t1, self.t2)); - } - } - - static void TryInvokeContinuationT2(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t2 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 2) - { - self.core.TrySetResult((self.t1, self.t2)); - } - } - - - public (T1, T2) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - - public static UniTask<(T1, T2, T3)> WhenAll(UniTask task1, UniTask task2, UniTask task3) - { - if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully()) - { - return new UniTask<(T1, T2, T3)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult())); - } - - return new UniTask<(T1, T2, T3)>(new WhenAllPromise(task1, task2, task3), 0); - } - - sealed class WhenAllPromise : IUniTaskSource<(T1, T2, T3)> - { - T1 t1 = default; - T2 t2 = default; - T3 t3 = default; - int completedCount; - UniTaskCompletionSourceCore<(T1, T2, T3)> core; - - public WhenAllPromise(UniTask task1, UniTask task2, UniTask task3) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t1 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 3) - { - self.core.TrySetResult((self.t1, self.t2, self.t3)); - } - } - - static void TryInvokeContinuationT2(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t2 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 3) - { - self.core.TrySetResult((self.t1, self.t2, self.t3)); - } - } - - static void TryInvokeContinuationT3(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t3 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 3) - { - self.core.TrySetResult((self.t1, self.t2, self.t3)); - } - } - - - public (T1, T2, T3) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - - public static UniTask<(T1, T2, T3, T4)> WhenAll(UniTask task1, UniTask task2, UniTask task3, UniTask task4) - { - if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully()) - { - return new UniTask<(T1, T2, T3, T4)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult())); - } - - return new UniTask<(T1, T2, T3, T4)>(new WhenAllPromise(task1, task2, task3, task4), 0); - } - - sealed class WhenAllPromise : IUniTaskSource<(T1, T2, T3, T4)> - { - T1 t1 = default; - T2 t2 = default; - T3 t3 = default; - T4 t4 = default; - int completedCount; - UniTaskCompletionSourceCore<(T1, T2, T3, T4)> core; - - public WhenAllPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t1 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 4) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4)); - } - } - - static void TryInvokeContinuationT2(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t2 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 4) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4)); - } - } - - static void TryInvokeContinuationT3(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t3 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 4) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4)); - } - } - - static void TryInvokeContinuationT4(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t4 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 4) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4)); - } - } - - - public (T1, T2, T3, T4) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - - public static UniTask<(T1, T2, T3, T4, T5)> WhenAll(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5) - { - if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully()) - { - return new UniTask<(T1, T2, T3, T4, T5)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult())); - } - - return new UniTask<(T1, T2, T3, T4, T5)>(new WhenAllPromise(task1, task2, task3, task4, task5), 0); - } - - sealed class WhenAllPromise : IUniTaskSource<(T1, T2, T3, T4, T5)> - { - T1 t1 = default; - T2 t2 = default; - T3 t3 = default; - T4 t4 = default; - T5 t5 = default; - int completedCount; - UniTaskCompletionSourceCore<(T1, T2, T3, T4, T5)> core; - - public WhenAllPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t1 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 5) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5)); - } - } - - static void TryInvokeContinuationT2(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t2 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 5) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5)); - } - } - - static void TryInvokeContinuationT3(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t3 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 5) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5)); - } - } - - static void TryInvokeContinuationT4(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t4 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 5) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5)); - } - } - - static void TryInvokeContinuationT5(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t5 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 5) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5)); - } - } - - - public (T1, T2, T3, T4, T5) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - - public static UniTask<(T1, T2, T3, T4, T5, T6)> WhenAll(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6) - { - if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully()) - { - return new UniTask<(T1, T2, T3, T4, T5, T6)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult())); - } - - return new UniTask<(T1, T2, T3, T4, T5, T6)>(new WhenAllPromise(task1, task2, task3, task4, task5, task6), 0); - } - - sealed class WhenAllPromise : IUniTaskSource<(T1, T2, T3, T4, T5, T6)> - { - T1 t1 = default; - T2 t2 = default; - T3 t3 = default; - T4 t4 = default; - T5 t5 = default; - T6 t6 = default; - int completedCount; - UniTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6)> core; - - public WhenAllPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t1 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 6) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6)); - } - } - - static void TryInvokeContinuationT2(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t2 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 6) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6)); - } - } - - static void TryInvokeContinuationT3(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t3 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 6) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6)); - } - } - - static void TryInvokeContinuationT4(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t4 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 6) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6)); - } - } - - static void TryInvokeContinuationT5(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t5 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 6) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6)); - } - } - - static void TryInvokeContinuationT6(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t6 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 6) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6)); - } - } - - - public (T1, T2, T3, T4, T5, T6) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - - public static UniTask<(T1, T2, T3, T4, T5, T6, T7)> WhenAll(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7) - { - if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully() && task7.Status.IsCompletedSuccessfully()) - { - return new UniTask<(T1, T2, T3, T4, T5, T6, T7)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult(), task7.GetAwaiter().GetResult())); - } - - return new UniTask<(T1, T2, T3, T4, T5, T6, T7)>(new WhenAllPromise(task1, task2, task3, task4, task5, task6, task7), 0); - } - - sealed class WhenAllPromise : IUniTaskSource<(T1, T2, T3, T4, T5, T6, T7)> - { - T1 t1 = default; - T2 t2 = default; - T3 t3 = default; - T4 t4 = default; - T5 t5 = default; - T6 t6 = default; - T7 t7 = default; - int completedCount; - UniTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6, T7)> core; - - public WhenAllPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task7.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT7(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT7(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t1 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 7) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7)); - } - } - - static void TryInvokeContinuationT2(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t2 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 7) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7)); - } - } - - static void TryInvokeContinuationT3(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t3 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 7) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7)); - } - } - - static void TryInvokeContinuationT4(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t4 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 7) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7)); - } - } - - static void TryInvokeContinuationT5(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t5 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 7) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7)); - } - } - - static void TryInvokeContinuationT6(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t6 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 7) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7)); - } - } - - static void TryInvokeContinuationT7(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t7 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 7) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7)); - } - } - - - public (T1, T2, T3, T4, T5, T6, T7) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - - public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8)> WhenAll(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8) - { - if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully() && task7.Status.IsCompletedSuccessfully() && task8.Status.IsCompletedSuccessfully()) - { - return new UniTask<(T1, T2, T3, T4, T5, T6, T7, T8)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult(), task7.GetAwaiter().GetResult(), task8.GetAwaiter().GetResult())); - } - - return new UniTask<(T1, T2, T3, T4, T5, T6, T7, T8)>(new WhenAllPromise(task1, task2, task3, task4, task5, task6, task7, task8), 0); - } - - sealed class WhenAllPromise : IUniTaskSource<(T1, T2, T3, T4, T5, T6, T7, T8)> - { - T1 t1 = default; - T2 t2 = default; - T3 t3 = default; - T4 t4 = default; - T5 t5 = default; - T6 t6 = default; - T7 t7 = default; - T8 t8 = default; - int completedCount; - UniTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6, T7, T8)> core; - - public WhenAllPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task7.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT7(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT7(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task8.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT8(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT8(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t1 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 8) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8)); - } - } - - static void TryInvokeContinuationT2(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t2 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 8) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8)); - } - } - - static void TryInvokeContinuationT3(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t3 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 8) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8)); - } - } - - static void TryInvokeContinuationT4(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t4 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 8) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8)); - } - } - - static void TryInvokeContinuationT5(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t5 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 8) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8)); - } - } - - static void TryInvokeContinuationT6(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t6 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 8) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8)); - } - } - - static void TryInvokeContinuationT7(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t7 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 8) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8)); - } - } - - static void TryInvokeContinuationT8(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t8 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 8) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8)); - } - } - - - public (T1, T2, T3, T4, T5, T6, T7, T8) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - - public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9)> WhenAll(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9) - { - if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully() && task7.Status.IsCompletedSuccessfully() && task8.Status.IsCompletedSuccessfully() && task9.Status.IsCompletedSuccessfully()) - { - return new UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult(), task7.GetAwaiter().GetResult(), task8.GetAwaiter().GetResult(), task9.GetAwaiter().GetResult())); - } - - return new UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9)>(new WhenAllPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9), 0); - } - - sealed class WhenAllPromise : IUniTaskSource<(T1, T2, T3, T4, T5, T6, T7, T8, T9)> - { - T1 t1 = default; - T2 t2 = default; - T3 t3 = default; - T4 t4 = default; - T5 t5 = default; - T6 t6 = default; - T7 t7 = default; - T8 t8 = default; - T9 t9 = default; - int completedCount; - UniTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6, T7, T8, T9)> core; - - public WhenAllPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task7.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT7(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT7(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task8.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT8(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT8(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task9.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT9(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT9(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t1 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 9) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9)); - } - } - - static void TryInvokeContinuationT2(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t2 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 9) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9)); - } - } - - static void TryInvokeContinuationT3(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t3 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 9) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9)); - } - } - - static void TryInvokeContinuationT4(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t4 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 9) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9)); - } - } - - static void TryInvokeContinuationT5(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t5 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 9) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9)); - } - } - - static void TryInvokeContinuationT6(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t6 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 9) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9)); - } - } - - static void TryInvokeContinuationT7(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t7 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 9) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9)); - } - } - - static void TryInvokeContinuationT8(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t8 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 9) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9)); - } - } - - static void TryInvokeContinuationT9(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t9 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 9) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9)); - } - } - - - public (T1, T2, T3, T4, T5, T6, T7, T8, T9) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - - public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)> WhenAll(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10) - { - if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully() && task7.Status.IsCompletedSuccessfully() && task8.Status.IsCompletedSuccessfully() && task9.Status.IsCompletedSuccessfully() && task10.Status.IsCompletedSuccessfully()) - { - return new UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult(), task7.GetAwaiter().GetResult(), task8.GetAwaiter().GetResult(), task9.GetAwaiter().GetResult(), task10.GetAwaiter().GetResult())); - } - - return new UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>(new WhenAllPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10), 0); - } - - sealed class WhenAllPromise : IUniTaskSource<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)> - { - T1 t1 = default; - T2 t2 = default; - T3 t3 = default; - T4 t4 = default; - T5 t5 = default; - T6 t6 = default; - T7 t7 = default; - T8 t8 = default; - T9 t9 = default; - T10 t10 = default; - int completedCount; - UniTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)> core; - - public WhenAllPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task7.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT7(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT7(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task8.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT8(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT8(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task9.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT9(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT9(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task10.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT10(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT10(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t1 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 10) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10)); - } - } - - static void TryInvokeContinuationT2(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t2 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 10) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10)); - } - } - - static void TryInvokeContinuationT3(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t3 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 10) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10)); - } - } - - static void TryInvokeContinuationT4(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t4 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 10) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10)); - } - } - - static void TryInvokeContinuationT5(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t5 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 10) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10)); - } - } - - static void TryInvokeContinuationT6(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t6 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 10) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10)); - } - } - - static void TryInvokeContinuationT7(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t7 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 10) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10)); - } - } - - static void TryInvokeContinuationT8(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t8 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 10) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10)); - } - } - - static void TryInvokeContinuationT9(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t9 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 10) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10)); - } - } - - static void TryInvokeContinuationT10(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t10 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 10) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10)); - } - } - - - public (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - - public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)> WhenAll(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11) - { - if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully() && task7.Status.IsCompletedSuccessfully() && task8.Status.IsCompletedSuccessfully() && task9.Status.IsCompletedSuccessfully() && task10.Status.IsCompletedSuccessfully() && task11.Status.IsCompletedSuccessfully()) - { - return new UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult(), task7.GetAwaiter().GetResult(), task8.GetAwaiter().GetResult(), task9.GetAwaiter().GetResult(), task10.GetAwaiter().GetResult(), task11.GetAwaiter().GetResult())); - } - - return new UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)>(new WhenAllPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11), 0); - } - - sealed class WhenAllPromise : IUniTaskSource<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)> - { - T1 t1 = default; - T2 t2 = default; - T3 t3 = default; - T4 t4 = default; - T5 t5 = default; - T6 t6 = default; - T7 t7 = default; - T8 t8 = default; - T9 t9 = default; - T10 t10 = default; - T11 t11 = default; - int completedCount; - UniTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)> core; - - public WhenAllPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task7.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT7(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT7(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task8.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT8(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT8(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task9.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT9(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT9(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task10.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT10(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT10(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task11.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT11(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT11(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t1 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 11) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11)); - } - } - - static void TryInvokeContinuationT2(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t2 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 11) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11)); - } - } - - static void TryInvokeContinuationT3(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t3 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 11) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11)); - } - } - - static void TryInvokeContinuationT4(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t4 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 11) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11)); - } - } - - static void TryInvokeContinuationT5(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t5 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 11) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11)); - } - } - - static void TryInvokeContinuationT6(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t6 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 11) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11)); - } - } - - static void TryInvokeContinuationT7(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t7 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 11) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11)); - } - } - - static void TryInvokeContinuationT8(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t8 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 11) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11)); - } - } - - static void TryInvokeContinuationT9(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t9 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 11) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11)); - } - } - - static void TryInvokeContinuationT10(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t10 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 11) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11)); - } - } - - static void TryInvokeContinuationT11(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t11 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 11) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11)); - } - } - - - public (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - - public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)> WhenAll(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12) - { - if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully() && task7.Status.IsCompletedSuccessfully() && task8.Status.IsCompletedSuccessfully() && task9.Status.IsCompletedSuccessfully() && task10.Status.IsCompletedSuccessfully() && task11.Status.IsCompletedSuccessfully() && task12.Status.IsCompletedSuccessfully()) - { - return new UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult(), task7.GetAwaiter().GetResult(), task8.GetAwaiter().GetResult(), task9.GetAwaiter().GetResult(), task10.GetAwaiter().GetResult(), task11.GetAwaiter().GetResult(), task12.GetAwaiter().GetResult())); - } - - return new UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)>(new WhenAllPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12), 0); - } - - sealed class WhenAllPromise : IUniTaskSource<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)> - { - T1 t1 = default; - T2 t2 = default; - T3 t3 = default; - T4 t4 = default; - T5 t5 = default; - T6 t6 = default; - T7 t7 = default; - T8 t8 = default; - T9 t9 = default; - T10 t10 = default; - T11 t11 = default; - T12 t12 = default; - int completedCount; - UniTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)> core; - - public WhenAllPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task7.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT7(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT7(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task8.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT8(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT8(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task9.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT9(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT9(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task10.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT10(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT10(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task11.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT11(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT11(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task12.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT12(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT12(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t1 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 12) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12)); - } - } - - static void TryInvokeContinuationT2(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t2 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 12) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12)); - } - } - - static void TryInvokeContinuationT3(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t3 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 12) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12)); - } - } - - static void TryInvokeContinuationT4(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t4 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 12) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12)); - } - } - - static void TryInvokeContinuationT5(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t5 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 12) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12)); - } - } - - static void TryInvokeContinuationT6(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t6 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 12) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12)); - } - } - - static void TryInvokeContinuationT7(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t7 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 12) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12)); - } - } - - static void TryInvokeContinuationT8(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t8 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 12) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12)); - } - } - - static void TryInvokeContinuationT9(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t9 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 12) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12)); - } - } - - static void TryInvokeContinuationT10(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t10 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 12) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12)); - } - } - - static void TryInvokeContinuationT11(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t11 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 12) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12)); - } - } - - static void TryInvokeContinuationT12(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t12 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 12) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12)); - } - } - - - public (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - - public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)> WhenAll(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13) - { - if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully() && task7.Status.IsCompletedSuccessfully() && task8.Status.IsCompletedSuccessfully() && task9.Status.IsCompletedSuccessfully() && task10.Status.IsCompletedSuccessfully() && task11.Status.IsCompletedSuccessfully() && task12.Status.IsCompletedSuccessfully() && task13.Status.IsCompletedSuccessfully()) - { - return new UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult(), task7.GetAwaiter().GetResult(), task8.GetAwaiter().GetResult(), task9.GetAwaiter().GetResult(), task10.GetAwaiter().GetResult(), task11.GetAwaiter().GetResult(), task12.GetAwaiter().GetResult(), task13.GetAwaiter().GetResult())); - } - - return new UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)>(new WhenAllPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12, task13), 0); - } - - sealed class WhenAllPromise : IUniTaskSource<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)> - { - T1 t1 = default; - T2 t2 = default; - T3 t3 = default; - T4 t4 = default; - T5 t5 = default; - T6 t6 = default; - T7 t7 = default; - T8 t8 = default; - T9 t9 = default; - T10 t10 = default; - T11 t11 = default; - T12 t12 = default; - T13 t13 = default; - int completedCount; - UniTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)> core; - - public WhenAllPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task7.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT7(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT7(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task8.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT8(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT8(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task9.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT9(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT9(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task10.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT10(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT10(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task11.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT11(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT11(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task12.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT12(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT12(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task13.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT13(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT13(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t1 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 13) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13)); - } - } - - static void TryInvokeContinuationT2(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t2 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 13) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13)); - } - } - - static void TryInvokeContinuationT3(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t3 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 13) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13)); - } - } - - static void TryInvokeContinuationT4(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t4 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 13) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13)); - } - } - - static void TryInvokeContinuationT5(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t5 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 13) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13)); - } - } - - static void TryInvokeContinuationT6(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t6 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 13) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13)); - } - } - - static void TryInvokeContinuationT7(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t7 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 13) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13)); - } - } - - static void TryInvokeContinuationT8(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t8 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 13) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13)); - } - } - - static void TryInvokeContinuationT9(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t9 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 13) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13)); - } - } - - static void TryInvokeContinuationT10(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t10 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 13) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13)); - } - } - - static void TryInvokeContinuationT11(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t11 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 13) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13)); - } - } - - static void TryInvokeContinuationT12(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t12 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 13) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13)); - } - } - - static void TryInvokeContinuationT13(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t13 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 13) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13)); - } - } - - - public (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - - public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)> WhenAll(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13, UniTask task14) - { - if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully() && task7.Status.IsCompletedSuccessfully() && task8.Status.IsCompletedSuccessfully() && task9.Status.IsCompletedSuccessfully() && task10.Status.IsCompletedSuccessfully() && task11.Status.IsCompletedSuccessfully() && task12.Status.IsCompletedSuccessfully() && task13.Status.IsCompletedSuccessfully() && task14.Status.IsCompletedSuccessfully()) - { - return new UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult(), task7.GetAwaiter().GetResult(), task8.GetAwaiter().GetResult(), task9.GetAwaiter().GetResult(), task10.GetAwaiter().GetResult(), task11.GetAwaiter().GetResult(), task12.GetAwaiter().GetResult(), task13.GetAwaiter().GetResult(), task14.GetAwaiter().GetResult())); - } - - return new UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)>(new WhenAllPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12, task13, task14), 0); - } - - sealed class WhenAllPromise : IUniTaskSource<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)> - { - T1 t1 = default; - T2 t2 = default; - T3 t3 = default; - T4 t4 = default; - T5 t5 = default; - T6 t6 = default; - T7 t7 = default; - T8 t8 = default; - T9 t9 = default; - T10 t10 = default; - T11 t11 = default; - T12 t12 = default; - T13 t13 = default; - T14 t14 = default; - int completedCount; - UniTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)> core; - - public WhenAllPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13, UniTask task14) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task7.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT7(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT7(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task8.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT8(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT8(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task9.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT9(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT9(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task10.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT10(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT10(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task11.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT11(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT11(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task12.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT12(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT12(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task13.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT13(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT13(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task14.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT14(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT14(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t1 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 14) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14)); - } - } - - static void TryInvokeContinuationT2(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t2 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 14) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14)); - } - } - - static void TryInvokeContinuationT3(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t3 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 14) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14)); - } - } - - static void TryInvokeContinuationT4(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t4 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 14) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14)); - } - } - - static void TryInvokeContinuationT5(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t5 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 14) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14)); - } - } - - static void TryInvokeContinuationT6(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t6 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 14) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14)); - } - } - - static void TryInvokeContinuationT7(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t7 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 14) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14)); - } - } - - static void TryInvokeContinuationT8(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t8 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 14) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14)); - } - } - - static void TryInvokeContinuationT9(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t9 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 14) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14)); - } - } - - static void TryInvokeContinuationT10(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t10 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 14) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14)); - } - } - - static void TryInvokeContinuationT11(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t11 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 14) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14)); - } - } - - static void TryInvokeContinuationT12(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t12 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 14) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14)); - } - } - - static void TryInvokeContinuationT13(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t13 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 14) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14)); - } - } - - static void TryInvokeContinuationT14(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t14 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 14) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14)); - } - } - - - public (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - - public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)> WhenAll(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13, UniTask task14, UniTask task15) - { - if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully() && task7.Status.IsCompletedSuccessfully() && task8.Status.IsCompletedSuccessfully() && task9.Status.IsCompletedSuccessfully() && task10.Status.IsCompletedSuccessfully() && task11.Status.IsCompletedSuccessfully() && task12.Status.IsCompletedSuccessfully() && task13.Status.IsCompletedSuccessfully() && task14.Status.IsCompletedSuccessfully() && task15.Status.IsCompletedSuccessfully()) - { - return new UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult(), task7.GetAwaiter().GetResult(), task8.GetAwaiter().GetResult(), task9.GetAwaiter().GetResult(), task10.GetAwaiter().GetResult(), task11.GetAwaiter().GetResult(), task12.GetAwaiter().GetResult(), task13.GetAwaiter().GetResult(), task14.GetAwaiter().GetResult(), task15.GetAwaiter().GetResult())); - } - - return new UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)>(new WhenAllPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12, task13, task14, task15), 0); - } - - sealed class WhenAllPromise : IUniTaskSource<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)> - { - T1 t1 = default; - T2 t2 = default; - T3 t3 = default; - T4 t4 = default; - T5 t5 = default; - T6 t6 = default; - T7 t7 = default; - T8 t8 = default; - T9 t9 = default; - T10 t10 = default; - T11 t11 = default; - T12 t12 = default; - T13 t13 = default; - T14 t14 = default; - T15 t15 = default; - int completedCount; - UniTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)> core; - - public WhenAllPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13, UniTask task14, UniTask task15) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task7.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT7(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT7(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task8.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT8(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT8(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task9.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT9(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT9(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task10.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT10(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT10(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task11.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT11(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT11(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task12.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT12(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT12(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task13.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT13(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT13(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task14.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT14(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT14(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task15.GetAwaiter(); - if (awaiter.IsCompleted) - { - TryInvokeContinuationT15(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT15(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t1 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 15) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15)); - } - } - - static void TryInvokeContinuationT2(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t2 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 15) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15)); - } - } - - static void TryInvokeContinuationT3(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t3 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 15) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15)); - } - } - - static void TryInvokeContinuationT4(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t4 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 15) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15)); - } - } - - static void TryInvokeContinuationT5(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t5 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 15) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15)); - } - } - - static void TryInvokeContinuationT6(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t6 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 15) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15)); - } - } - - static void TryInvokeContinuationT7(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t7 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 15) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15)); - } - } - - static void TryInvokeContinuationT8(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t8 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 15) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15)); - } - } - - static void TryInvokeContinuationT9(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t9 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 15) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15)); - } - } - - static void TryInvokeContinuationT10(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t10 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 15) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15)); - } - } - - static void TryInvokeContinuationT11(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t11 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 15) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15)); - } - } - - static void TryInvokeContinuationT12(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t12 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 15) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15)); - } - } - - static void TryInvokeContinuationT13(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t13 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 15) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15)); - } - } - - static void TryInvokeContinuationT14(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t14 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 15) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15)); - } - } - - static void TryInvokeContinuationT15(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - self.t15 = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 15) - { - self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15)); - } - } - - - public (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/UniTask.WhenAll.Generated.cs.meta b/VirtueSky/UniTask/Runtime/UniTask.WhenAll.Generated.cs.meta deleted file mode 100644 index 40ed46cd..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.WhenAll.Generated.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5110117231c8a6d4095fd0cbd3f4c142 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTask.WhenAll.cs b/VirtueSky/UniTask/Runtime/UniTask.WhenAll.cs deleted file mode 100644 index a7fa9faa..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.WhenAll.cs +++ /dev/null @@ -1,237 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Collections.Generic; -using System.Threading; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks -{ - public partial struct UniTask - { - public static UniTask WhenAll(params UniTask[] tasks) - { - if (tasks.Length == 0) - { - return UniTask.FromResult(Array.Empty()); - } - - return new UniTask(new WhenAllPromise(tasks, tasks.Length), 0); - } - - public static UniTask WhenAll(IEnumerable> tasks) - { - using (var span = ArrayPoolUtil.Materialize(tasks)) - { - var promise = new WhenAllPromise(span.Array, span.Length); // consumed array in constructor. - return new UniTask(promise, 0); - } - } - - public static UniTask WhenAll(params UniTask[] tasks) - { - if (tasks.Length == 0) - { - return UniTask.CompletedTask; - } - - return new UniTask(new WhenAllPromise(tasks, tasks.Length), 0); - } - - public static UniTask WhenAll(IEnumerable tasks) - { - using (var span = ArrayPoolUtil.Materialize(tasks)) - { - var promise = new WhenAllPromise(span.Array, span.Length); // consumed array in constructor. - return new UniTask(promise, 0); - } - } - - sealed class WhenAllPromise : IUniTaskSource - { - T[] result; - int completeCount; - UniTaskCompletionSourceCore core; // don't reset(called after GetResult, will invoke TrySetException.) - - public WhenAllPromise(UniTask[] tasks, int tasksLength) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completeCount = 0; - - if (tasksLength == 0) - { - this.result = Array.Empty(); - core.TrySetResult(result); - return; - } - - this.result = new T[tasksLength]; - - for (int i = 0; i < tasksLength; i++) - { - UniTask.Awaiter awaiter; - try - { - awaiter = tasks[i].GetAwaiter(); - } - catch (Exception ex) - { - core.TrySetException(ex); - continue; - } - - if (awaiter.IsCompleted) - { - TryInvokeContinuation(this, awaiter, i); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter, int>)state) - { - TryInvokeContinuation(t.Item1, t.Item2, t.Item3); - } - }, StateTuple.Create(this, awaiter, i)); - } - } - } - - static void TryInvokeContinuation(WhenAllPromise self, in UniTask.Awaiter awaiter, int i) - { - try - { - self.result[i] = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completeCount) == self.result.Length) - { - self.core.TrySetResult(self.result); - } - } - - public T[] GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - - sealed class WhenAllPromise : IUniTaskSource - { - int completeCount; - int tasksLength; - UniTaskCompletionSourceCore core; // don't reset(called after GetResult, will invoke TrySetException.) - - public WhenAllPromise(UniTask[] tasks, int tasksLength) - { - TaskTracker.TrackActiveTask(this, 3); - - this.tasksLength = tasksLength; - this.completeCount = 0; - - if (tasksLength == 0) - { - core.TrySetResult(AsyncUnit.Default); - return; - } - - for (int i = 0; i < tasksLength; i++) - { - UniTask.Awaiter awaiter; - try - { - awaiter = tasks[i].GetAwaiter(); - } - catch (Exception ex) - { - core.TrySetException(ex); - continue; - } - - if (awaiter.IsCompleted) - { - TryInvokeContinuation(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple)state) - { - TryInvokeContinuation(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuation(WhenAllPromise self, in UniTask.Awaiter awaiter) - { - try - { - awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completeCount) == self.tasksLength) - { - self.core.TrySetResult(AsyncUnit.Default); - } - } - - public void GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - } -} diff --git a/VirtueSky/UniTask/Runtime/UniTask.WhenAll.cs.meta b/VirtueSky/UniTask/Runtime/UniTask.WhenAll.cs.meta deleted file mode 100644 index 0366aa87..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.WhenAll.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 355997a305ba64248822eec34998a1a0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTask.WhenAny.Generated.cs b/VirtueSky/UniTask/Runtime/UniTask.WhenAny.Generated.cs deleted file mode 100644 index ee15406b..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.WhenAny.Generated.cs +++ /dev/null @@ -1,5060 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -using System; -using System.Runtime.CompilerServices; -using System.Runtime.ExceptionServices; -using System.Threading; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks -{ - public partial struct UniTask - { - public static UniTask<(int winArgumentIndex, T1 result1, T2 result2)> WhenAny(UniTask task1, UniTask task2) - { - return new UniTask<(int winArgumentIndex, T1 result1, T2 result2)>(new WhenAnyPromise(task1, task2), 0); - } - - sealed class WhenAnyPromise : IUniTaskSource<(int, T1 result1, T2 result2)> - { - int completedCount; - UniTaskCompletionSourceCore<(int, T1 result1, T2 result2)> core; - - public WhenAnyPromise(UniTask task1, UniTask task2) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T1 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((0, result, default)); - } - } - - static void TryInvokeContinuationT2(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T2 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((1, default, result)); - } - } - - - public (int, T1 result1, T2 result2) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - } - - public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3)> WhenAny(UniTask task1, UniTask task2, UniTask task3) - { - return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3)>(new WhenAnyPromise(task1, task2, task3), 0); - } - - sealed class WhenAnyPromise : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3)> - { - int completedCount; - UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3)> core; - - public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T1 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((0, result, default, default)); - } - } - - static void TryInvokeContinuationT2(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T2 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((1, default, result, default)); - } - } - - static void TryInvokeContinuationT3(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T3 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((2, default, default, result)); - } - } - - - public (int, T1 result1, T2 result2, T3 result3) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - } - - public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4)> WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4) - { - return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4)>(new WhenAnyPromise(task1, task2, task3, task4), 0); - } - - sealed class WhenAnyPromise : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4)> - { - int completedCount; - UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4)> core; - - public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T1 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((0, result, default, default, default)); - } - } - - static void TryInvokeContinuationT2(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T2 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((1, default, result, default, default)); - } - } - - static void TryInvokeContinuationT3(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T3 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((2, default, default, result, default)); - } - } - - static void TryInvokeContinuationT4(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T4 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((3, default, default, default, result)); - } - } - - - public (int, T1 result1, T2 result2, T3 result3, T4 result4) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - } - - public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5)> WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5) - { - return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5)>(new WhenAnyPromise(task1, task2, task3, task4, task5), 0); - } - - sealed class WhenAnyPromise : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5)> - { - int completedCount; - UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5)> core; - - public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T1 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((0, result, default, default, default, default)); - } - } - - static void TryInvokeContinuationT2(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T2 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((1, default, result, default, default, default)); - } - } - - static void TryInvokeContinuationT3(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T3 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((2, default, default, result, default, default)); - } - } - - static void TryInvokeContinuationT4(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T4 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((3, default, default, default, result, default)); - } - } - - static void TryInvokeContinuationT5(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T5 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((4, default, default, default, default, result)); - } - } - - - public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - } - - public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6)> WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6) - { - return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6)>(new WhenAnyPromise(task1, task2, task3, task4, task5, task6), 0); - } - - sealed class WhenAnyPromise : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6)> - { - int completedCount; - UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6)> core; - - public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T1 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((0, result, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT2(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T2 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((1, default, result, default, default, default, default)); - } - } - - static void TryInvokeContinuationT3(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T3 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((2, default, default, result, default, default, default)); - } - } - - static void TryInvokeContinuationT4(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T4 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((3, default, default, default, result, default, default)); - } - } - - static void TryInvokeContinuationT5(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T5 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((4, default, default, default, default, result, default)); - } - } - - static void TryInvokeContinuationT6(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T6 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((5, default, default, default, default, default, result)); - } - } - - - public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - } - - public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7)> WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7) - { - return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7)>(new WhenAnyPromise(task1, task2, task3, task4, task5, task6, task7), 0); - } - - sealed class WhenAnyPromise : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7)> - { - int completedCount; - UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7)> core; - - public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task7.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT7(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT7(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T1 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((0, result, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT2(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T2 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((1, default, result, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT3(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T3 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((2, default, default, result, default, default, default, default)); - } - } - - static void TryInvokeContinuationT4(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T4 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((3, default, default, default, result, default, default, default)); - } - } - - static void TryInvokeContinuationT5(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T5 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((4, default, default, default, default, result, default, default)); - } - } - - static void TryInvokeContinuationT6(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T6 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((5, default, default, default, default, default, result, default)); - } - } - - static void TryInvokeContinuationT7(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T7 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((6, default, default, default, default, default, default, result)); - } - } - - - public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - } - - public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8)> WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8) - { - return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8)>(new WhenAnyPromise(task1, task2, task3, task4, task5, task6, task7, task8), 0); - } - - sealed class WhenAnyPromise : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8)> - { - int completedCount; - UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8)> core; - - public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task7.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT7(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT7(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task8.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT8(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT8(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T1 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((0, result, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT2(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T2 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((1, default, result, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT3(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T3 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((2, default, default, result, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT4(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T4 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((3, default, default, default, result, default, default, default, default)); - } - } - - static void TryInvokeContinuationT5(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T5 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((4, default, default, default, default, result, default, default, default)); - } - } - - static void TryInvokeContinuationT6(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T6 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((5, default, default, default, default, default, result, default, default)); - } - } - - static void TryInvokeContinuationT7(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T7 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((6, default, default, default, default, default, default, result, default)); - } - } - - static void TryInvokeContinuationT8(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T8 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((7, default, default, default, default, default, default, default, result)); - } - } - - - public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - } - - public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9)> WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9) - { - return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9)>(new WhenAnyPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9), 0); - } - - sealed class WhenAnyPromise : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9)> - { - int completedCount; - UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9)> core; - - public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task7.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT7(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT7(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task8.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT8(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT8(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task9.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT9(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT9(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T1 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT2(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T2 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT3(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T3 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT4(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T4 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT5(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T5 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default)); - } - } - - static void TryInvokeContinuationT6(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T6 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default)); - } - } - - static void TryInvokeContinuationT7(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T7 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default)); - } - } - - static void TryInvokeContinuationT8(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T8 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default)); - } - } - - static void TryInvokeContinuationT9(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T9 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result)); - } - } - - - public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - } - - public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10)> WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10) - { - return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10)>(new WhenAnyPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10), 0); - } - - sealed class WhenAnyPromise : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10)> - { - int completedCount; - UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10)> core; - - public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task7.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT7(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT7(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task8.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT8(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT8(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task9.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT9(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT9(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task10.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT10(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT10(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T1 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT2(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T2 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT3(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T3 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT4(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T4 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT5(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T5 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT6(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T6 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default, default)); - } - } - - static void TryInvokeContinuationT7(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T7 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default, default)); - } - } - - static void TryInvokeContinuationT8(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T8 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default, default)); - } - } - - static void TryInvokeContinuationT9(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T9 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result, default)); - } - } - - static void TryInvokeContinuationT10(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T10 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((9, default, default, default, default, default, default, default, default, default, result)); - } - } - - - public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - } - - public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11)> WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11) - { - return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11)>(new WhenAnyPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11), 0); - } - - sealed class WhenAnyPromise : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11)> - { - int completedCount; - UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11)> core; - - public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task7.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT7(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT7(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task8.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT8(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT8(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task9.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT9(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT9(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task10.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT10(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT10(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task11.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT11(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT11(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T1 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT2(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T2 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT3(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T3 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT4(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T4 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT5(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T5 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT6(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T6 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT7(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T7 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default, default, default)); - } - } - - static void TryInvokeContinuationT8(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T8 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default, default, default)); - } - } - - static void TryInvokeContinuationT9(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T9 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result, default, default)); - } - } - - static void TryInvokeContinuationT10(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T10 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((9, default, default, default, default, default, default, default, default, default, result, default)); - } - } - - static void TryInvokeContinuationT11(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T11 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((10, default, default, default, default, default, default, default, default, default, default, result)); - } - } - - - public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - } - - public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12)> WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12) - { - return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12)>(new WhenAnyPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12), 0); - } - - sealed class WhenAnyPromise : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12)> - { - int completedCount; - UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12)> core; - - public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task7.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT7(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT7(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task8.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT8(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT8(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task9.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT9(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT9(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task10.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT10(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT10(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task11.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT11(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT11(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task12.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT12(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT12(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T1 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT2(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T2 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT3(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T3 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT4(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T4 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT5(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T5 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT6(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T6 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT7(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T7 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT8(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T8 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default, default, default, default)); - } - } - - static void TryInvokeContinuationT9(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T9 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result, default, default, default)); - } - } - - static void TryInvokeContinuationT10(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T10 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((9, default, default, default, default, default, default, default, default, default, result, default, default)); - } - } - - static void TryInvokeContinuationT11(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T11 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((10, default, default, default, default, default, default, default, default, default, default, result, default)); - } - } - - static void TryInvokeContinuationT12(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T12 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((11, default, default, default, default, default, default, default, default, default, default, default, result)); - } - } - - - public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - } - - public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13)> WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13) - { - return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13)>(new WhenAnyPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12, task13), 0); - } - - sealed class WhenAnyPromise : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13)> - { - int completedCount; - UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13)> core; - - public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task7.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT7(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT7(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task8.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT8(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT8(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task9.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT9(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT9(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task10.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT10(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT10(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task11.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT11(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT11(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task12.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT12(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT12(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task13.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT13(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT13(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T1 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT2(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T2 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT3(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T3 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT4(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T4 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT5(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T5 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT6(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T6 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT7(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T7 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT8(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T8 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT9(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T9 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result, default, default, default, default)); - } - } - - static void TryInvokeContinuationT10(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T10 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((9, default, default, default, default, default, default, default, default, default, result, default, default, default)); - } - } - - static void TryInvokeContinuationT11(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T11 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((10, default, default, default, default, default, default, default, default, default, default, result, default, default)); - } - } - - static void TryInvokeContinuationT12(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T12 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((11, default, default, default, default, default, default, default, default, default, default, default, result, default)); - } - } - - static void TryInvokeContinuationT13(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T13 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((12, default, default, default, default, default, default, default, default, default, default, default, default, result)); - } - } - - - public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - } - - public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14)> WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13, UniTask task14) - { - return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14)>(new WhenAnyPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12, task13, task14), 0); - } - - sealed class WhenAnyPromise : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14)> - { - int completedCount; - UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14)> core; - - public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13, UniTask task14) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task7.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT7(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT7(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task8.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT8(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT8(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task9.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT9(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT9(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task10.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT10(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT10(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task11.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT11(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT11(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task12.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT12(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT12(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task13.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT13(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT13(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task14.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT14(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT14(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T1 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT2(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T2 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT3(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T3 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT4(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T4 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT5(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T5 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT6(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T6 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT7(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T7 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT8(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T8 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT9(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T9 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT10(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T10 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((9, default, default, default, default, default, default, default, default, default, result, default, default, default, default)); - } - } - - static void TryInvokeContinuationT11(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T11 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((10, default, default, default, default, default, default, default, default, default, default, result, default, default, default)); - } - } - - static void TryInvokeContinuationT12(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T12 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((11, default, default, default, default, default, default, default, default, default, default, default, result, default, default)); - } - } - - static void TryInvokeContinuationT13(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T13 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((12, default, default, default, default, default, default, default, default, default, default, default, default, result, default)); - } - } - - static void TryInvokeContinuationT14(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T14 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((13, default, default, default, default, default, default, default, default, default, default, default, default, default, result)); - } - } - - - public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - } - - public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14, T15 result15)> WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13, UniTask task14, UniTask task15) - { - return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14, T15 result15)>(new WhenAnyPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12, task13, task14, task15), 0); - } - - sealed class WhenAnyPromise : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14, T15 result15)> - { - int completedCount; - UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14, T15 result15)> core; - - public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13, UniTask task14, UniTask task15) - { - TaskTracker.TrackActiveTask(this, 3); - - this.completedCount = 0; - { - var awaiter = task1.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT1(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT1(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task2.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT2(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT2(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task3.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT3(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT3(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task4.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT4(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT4(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task5.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT5(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT5(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task6.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT6(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT6(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task7.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT7(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT7(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task8.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT8(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT8(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task9.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT9(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT9(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task10.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT10(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT10(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task11.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT11(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT11(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task12.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT12(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT12(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task13.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT13(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT13(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task14.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT14(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT14(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - { - var awaiter = task15.GetAwaiter(); - - if (awaiter.IsCompleted) - { - TryInvokeContinuationT15(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryInvokeContinuationT15(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryInvokeContinuationT1(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T1 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT2(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T2 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT3(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T3 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT4(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T4 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT5(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T5 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT6(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T6 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT7(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T7 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT8(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T8 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT9(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T9 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result, default, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT10(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T10 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((9, default, default, default, default, default, default, default, default, default, result, default, default, default, default, default)); - } - } - - static void TryInvokeContinuationT11(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T11 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((10, default, default, default, default, default, default, default, default, default, default, result, default, default, default, default)); - } - } - - static void TryInvokeContinuationT12(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T12 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((11, default, default, default, default, default, default, default, default, default, default, default, result, default, default, default)); - } - } - - static void TryInvokeContinuationT13(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T13 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((12, default, default, default, default, default, default, default, default, default, default, default, default, result, default, default)); - } - } - - static void TryInvokeContinuationT14(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T14 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((13, default, default, default, default, default, default, default, default, default, default, default, default, default, result, default)); - } - } - - static void TryInvokeContinuationT15(WhenAnyPromise self, in UniTask.Awaiter awaiter) - { - T15 result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((14, default, default, default, default, default, default, default, default, default, default, default, default, default, default, result)); - } - } - - - public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14, T15 result15) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - } - - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/UniTask.WhenAny.Generated.cs.meta b/VirtueSky/UniTask/Runtime/UniTask.WhenAny.Generated.cs.meta deleted file mode 100644 index 49a2c3fd..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.WhenAny.Generated.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 13d604ac281570c4eac9962429f19ca9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTask.WhenAny.cs b/VirtueSky/UniTask/Runtime/UniTask.WhenAny.cs deleted file mode 100644 index ecd6e4c4..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.WhenAny.cs +++ /dev/null @@ -1,359 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Collections.Generic; -using System.Threading; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks -{ - public partial struct UniTask - { - public static UniTask<(bool hasResultLeft, T result)> WhenAny(UniTask leftTask, UniTask rightTask) - { - return new UniTask<(bool, T)>(new WhenAnyLRPromise(leftTask, rightTask), 0); - } - - public static UniTask<(int winArgumentIndex, T result)> WhenAny(params UniTask[] tasks) - { - return new UniTask<(int, T)>(new WhenAnyPromise(tasks, tasks.Length), 0); - } - - public static UniTask<(int winArgumentIndex, T result)> WhenAny(IEnumerable> tasks) - { - using (var span = ArrayPoolUtil.Materialize(tasks)) - { - return new UniTask<(int, T)>(new WhenAnyPromise(span.Array, span.Length), 0); - } - } - - /// Return value is winArgumentIndex - public static UniTask WhenAny(params UniTask[] tasks) - { - return new UniTask(new WhenAnyPromise(tasks, tasks.Length), 0); - } - - /// Return value is winArgumentIndex - public static UniTask WhenAny(IEnumerable tasks) - { - using (var span = ArrayPoolUtil.Materialize(tasks)) - { - return new UniTask(new WhenAnyPromise(span.Array, span.Length), 0); - } - } - - sealed class WhenAnyLRPromise : IUniTaskSource<(bool, T)> - { - int completedCount; - UniTaskCompletionSourceCore<(bool, T)> core; - - public WhenAnyLRPromise(UniTask leftTask, UniTask rightTask) - { - TaskTracker.TrackActiveTask(this, 3); - - { - UniTask.Awaiter awaiter; - try - { - awaiter = leftTask.GetAwaiter(); - } - catch (Exception ex) - { - core.TrySetException(ex); - goto RIGHT; - } - - if (awaiter.IsCompleted) - { - TryLeftInvokeContinuation(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryLeftInvokeContinuation(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - RIGHT: - { - UniTask.Awaiter awaiter; - try - { - awaiter = rightTask.GetAwaiter(); - } - catch (Exception ex) - { - core.TrySetException(ex); - return; - } - - if (awaiter.IsCompleted) - { - TryRightInvokeContinuation(this, awaiter); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter>)state) - { - TryRightInvokeContinuation(t.Item1, t.Item2); - } - }, StateTuple.Create(this, awaiter)); - } - } - } - - static void TryLeftInvokeContinuation(WhenAnyLRPromise self, in UniTask.Awaiter awaiter) - { - T result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((true, result)); - } - } - - static void TryRightInvokeContinuation(WhenAnyLRPromise self, in UniTask.Awaiter awaiter) - { - try - { - awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((false, default)); - } - } - - public (bool, T) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - } - - - sealed class WhenAnyPromise : IUniTaskSource<(int, T)> - { - int completedCount; - UniTaskCompletionSourceCore<(int, T)> core; - - public WhenAnyPromise(UniTask[] tasks, int tasksLength) - { - if (tasksLength == 0) - { - throw new ArgumentException("The tasks argument contains no tasks."); - } - - TaskTracker.TrackActiveTask(this, 3); - - for (int i = 0; i < tasksLength; i++) - { - UniTask.Awaiter awaiter; - try - { - awaiter = tasks[i].GetAwaiter(); - } - catch (Exception ex) - { - core.TrySetException(ex); - continue; // consume others. - } - - if (awaiter.IsCompleted) - { - TryInvokeContinuation(this, awaiter, i); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple, UniTask.Awaiter, int>)state) - { - TryInvokeContinuation(t.Item1, t.Item2, t.Item3); - } - }, StateTuple.Create(this, awaiter, i)); - } - } - } - - static void TryInvokeContinuation(WhenAnyPromise self, in UniTask.Awaiter awaiter, int i) - { - T result; - try - { - result = awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult((i, result)); - } - } - - public (int, T) GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - } - - sealed class WhenAnyPromise : IUniTaskSource - { - int completedCount; - UniTaskCompletionSourceCore core; - - public WhenAnyPromise(UniTask[] tasks, int tasksLength) - { - if (tasksLength == 0) - { - throw new ArgumentException("The tasks argument contains no tasks."); - } - - TaskTracker.TrackActiveTask(this, 3); - - for (int i = 0; i < tasksLength; i++) - { - UniTask.Awaiter awaiter; - try - { - awaiter = tasks[i].GetAwaiter(); - } - catch (Exception ex) - { - core.TrySetException(ex); - continue; // consume others. - } - - if (awaiter.IsCompleted) - { - TryInvokeContinuation(this, awaiter, i); - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple)state) - { - TryInvokeContinuation(t.Item1, t.Item2, t.Item3); - } - }, StateTuple.Create(this, awaiter, i)); - } - } - } - - static void TryInvokeContinuation(WhenAnyPromise self, in UniTask.Awaiter awaiter, int i) - { - try - { - awaiter.GetResult(); - } - catch (Exception ex) - { - self.core.TrySetException(ex); - return; - } - - if (Interlocked.Increment(ref self.completedCount) == 1) - { - self.core.TrySetResult(i); - } - } - - public int GetResult(short token) - { - TaskTracker.RemoveTracking(this); - GC.SuppressFinalize(this); - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/UniTask.WhenAny.cs.meta b/VirtueSky/UniTask/Runtime/UniTask.WhenAny.cs.meta deleted file mode 100644 index c10f7621..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.WhenAny.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c32578978c37eaf41bdd90e1b034637d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTask.cs b/VirtueSky/UniTask/Runtime/UniTask.cs deleted file mode 100644 index b90d9cdb..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.cs +++ /dev/null @@ -1,711 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -#pragma warning disable CS0436 - -#if UNITASK_NETCORE || UNITY_2022_3_OR_NEWER -#define SUPPORT_VALUETASK -#endif - -using VirtueSky.Threading.Tasks.CompilerServices; -using System; -using System.Diagnostics; -using System.Runtime.CompilerServices; -using System.Runtime.ExceptionServices; -using System.Runtime.InteropServices; - -namespace VirtueSky.Threading.Tasks -{ - internal static class AwaiterActions - { - internal static readonly Action InvokeContinuationDelegate = Continuation; - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - static void Continuation(object state) - { - ((Action)state).Invoke(); - } - } - - /// - /// Lightweight unity specified task-like object. - /// - [AsyncMethodBuilder(typeof(AsyncUniTaskMethodBuilder))] - [StructLayout(LayoutKind.Auto)] - public readonly partial struct UniTask - { - readonly IUniTaskSource source; - readonly short token; - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public UniTask(IUniTaskSource source, short token) - { - this.source = source; - this.token = token; - } - - public UniTaskStatus Status - { - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - if (source == null) return UniTaskStatus.Succeeded; - return source.GetStatus(token); - } - } - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Awaiter GetAwaiter() - { - return new Awaiter(this); - } - - /// - /// returns (bool IsCanceled) instead of throws OperationCanceledException. - /// - public UniTask SuppressCancellationThrow() - { - var status = Status; - if (status == UniTaskStatus.Succeeded) return CompletedTasks.False; - if (status == UniTaskStatus.Canceled) return CompletedTasks.True; - return new UniTask(new IsCanceledSource(source), token); - } - -#if SUPPORT_VALUETASK - - public static implicit operator System.Threading.Tasks.ValueTask(in UniTask self) - { - if (self.source == null) - { - return default; - } - -#if (UNITASK_NETCORE && NETSTANDARD2_0) - return self.AsValueTask(); -#else - return new System.Threading.Tasks.ValueTask(self.source, self.token); -#endif - } - -#endif - - public override string ToString() - { - if (source == null) return "()"; - return "(" + source.UnsafeGetStatus() + ")"; - } - - /// - /// Memoizing inner IValueTaskSource. The result UniTask can await multiple. - /// - public UniTask Preserve() - { - if (source == null) - { - return this; - } - else - { - return new UniTask(new MemoizeSource(source), token); - } - } - - public UniTask AsAsyncUnitUniTask() - { - if (this.source == null) return CompletedTasks.AsyncUnit; - - var status = this.source.GetStatus(this.token); - if (status.IsCompletedSuccessfully()) - { - this.source.GetResult(this.token); - return CompletedTasks.AsyncUnit; - } - else if (this.source is IUniTaskSource asyncUnitSource) - { - return new UniTask(asyncUnitSource, this.token); - } - - return new UniTask(new AsyncUnitSource(this.source), this.token); - } - - sealed class AsyncUnitSource : IUniTaskSource - { - readonly IUniTaskSource source; - - public AsyncUnitSource(IUniTaskSource source) - { - this.source = source; - } - - public AsyncUnit GetResult(short token) - { - source.GetResult(token); - return AsyncUnit.Default; - } - - public UniTaskStatus GetStatus(short token) - { - return source.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - source.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return source.UnsafeGetStatus(); - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - } - - sealed class IsCanceledSource : IUniTaskSource - { - readonly IUniTaskSource source; - - public IsCanceledSource(IUniTaskSource source) - { - this.source = source; - } - - public bool GetResult(short token) - { - if (source.GetStatus(token) == UniTaskStatus.Canceled) - { - return true; - } - - source.GetResult(token); - return false; - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return source.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return source.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - source.OnCompleted(continuation, state, token); - } - } - - sealed class MemoizeSource : IUniTaskSource - { - IUniTaskSource source; - ExceptionDispatchInfo exception; - UniTaskStatus status; - - public MemoizeSource(IUniTaskSource source) - { - this.source = source; - } - - public void GetResult(short token) - { - if (source == null) - { - if (exception != null) - { - exception.Throw(); - } - } - else - { - try - { - source.GetResult(token); - status = UniTaskStatus.Succeeded; - } - catch (Exception ex) - { - exception = ExceptionDispatchInfo.Capture(ex); - if (ex is OperationCanceledException) - { - status = UniTaskStatus.Canceled; - } - else - { - status = UniTaskStatus.Faulted; - } - throw; - } - finally - { - source = null; - } - } - } - - public UniTaskStatus GetStatus(short token) - { - if (source == null) - { - return status; - } - - return source.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - if (source == null) - { - continuation(state); - } - else - { - source.OnCompleted(continuation, state, token); - } - } - - public UniTaskStatus UnsafeGetStatus() - { - if (source == null) - { - return status; - } - - return source.UnsafeGetStatus(); - } - } - - public readonly struct Awaiter : ICriticalNotifyCompletion - { - readonly UniTask task; - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Awaiter(in UniTask task) - { - this.task = task; - } - - public bool IsCompleted - { - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return task.Status.IsCompleted(); - } - } - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void GetResult() - { - if (task.source == null) return; - task.source.GetResult(task.token); - } - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void OnCompleted(Action continuation) - { - if (task.source == null) - { - continuation(); - } - else - { - task.source.OnCompleted(AwaiterActions.InvokeContinuationDelegate, continuation, task.token); - } - } - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void UnsafeOnCompleted(Action continuation) - { - if (task.source == null) - { - continuation(); - } - else - { - task.source.OnCompleted(AwaiterActions.InvokeContinuationDelegate, continuation, task.token); - } - } - - /// - /// If register manually continuation, you can use it instead of for compiler OnCompleted methods. - /// - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void SourceOnCompleted(Action continuation, object state) - { - if (task.source == null) - { - continuation(state); - } - else - { - task.source.OnCompleted(continuation, state, task.token); - } - } - } - } - - /// - /// Lightweight unity specified task-like object. - /// - [AsyncMethodBuilder(typeof(AsyncUniTaskMethodBuilder<>))] - [StructLayout(LayoutKind.Auto)] - public readonly struct UniTask - { - readonly IUniTaskSource source; - readonly T result; - readonly short token; - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public UniTask(T result) - { - this.source = default; - this.token = default; - this.result = result; - } - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public UniTask(IUniTaskSource source, short token) - { - this.source = source; - this.token = token; - this.result = default; - } - - public UniTaskStatus Status - { - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return (source == null) ? UniTaskStatus.Succeeded : source.GetStatus(token); - } - } - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Awaiter GetAwaiter() - { - return new Awaiter(this); - } - - /// - /// Memoizing inner IValueTaskSource. The result UniTask can await multiple. - /// - public UniTask Preserve() - { - if (source == null) - { - return this; - } - else - { - return new UniTask(new MemoizeSource(source), token); - } - } - - public UniTask AsUniTask() - { - if (this.source == null) return UniTask.CompletedTask; - - var status = this.source.GetStatus(this.token); - if (status.IsCompletedSuccessfully()) - { - this.source.GetResult(this.token); - return UniTask.CompletedTask; - } - - // Converting UniTask -> UniTask is zero overhead. - return new UniTask(this.source, this.token); - } - - public static implicit operator UniTask(UniTask self) - { - return self.AsUniTask(); - } - -#if SUPPORT_VALUETASK - - public static implicit operator System.Threading.Tasks.ValueTask(in UniTask self) - { - if (self.source == null) - { - return new System.Threading.Tasks.ValueTask(self.result); - } - -#if (UNITASK_NETCORE && NETSTANDARD2_0) - return self.AsValueTask(); -#else - return new System.Threading.Tasks.ValueTask(self.source, self.token); -#endif - } - -#endif - - /// - /// returns (bool IsCanceled, T Result) instead of throws OperationCanceledException. - /// - public UniTask<(bool IsCanceled, T Result)> SuppressCancellationThrow() - { - if (source == null) - { - return new UniTask<(bool IsCanceled, T Result)>((false, result)); - } - - return new UniTask<(bool, T)>(new IsCanceledSource(source), token); - } - - public override string ToString() - { - return (this.source == null) ? result?.ToString() - : "(" + this.source.UnsafeGetStatus() + ")"; - } - - sealed class IsCanceledSource : IUniTaskSource<(bool, T)> - { - readonly IUniTaskSource source; - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public IsCanceledSource(IUniTaskSource source) - { - this.source = source; - } - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public (bool, T) GetResult(short token) - { - if (source.GetStatus(token) == UniTaskStatus.Canceled) - { - return (true, default); - } - - var result = source.GetResult(token); - return (false, result); - } - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public UniTaskStatus GetStatus(short token) - { - return source.GetStatus(token); - } - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public UniTaskStatus UnsafeGetStatus() - { - return source.UnsafeGetStatus(); - } - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void OnCompleted(Action continuation, object state, short token) - { - source.OnCompleted(continuation, state, token); - } - } - - sealed class MemoizeSource : IUniTaskSource - { - IUniTaskSource source; - T result; - ExceptionDispatchInfo exception; - UniTaskStatus status; - - public MemoizeSource(IUniTaskSource source) - { - this.source = source; - } - - public T GetResult(short token) - { - if (source == null) - { - if (exception != null) - { - exception.Throw(); - } - return result; - } - else - { - try - { - result = source.GetResult(token); - status = UniTaskStatus.Succeeded; - return result; - } - catch (Exception ex) - { - exception = ExceptionDispatchInfo.Capture(ex); - if (ex is OperationCanceledException) - { - status = UniTaskStatus.Canceled; - } - else - { - status = UniTaskStatus.Faulted; - } - throw; - } - finally - { - source = null; - } - } - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - if (source == null) - { - return status; - } - - return source.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - if (source == null) - { - continuation(state); - } - else - { - source.OnCompleted(continuation, state, token); - } - } - - public UniTaskStatus UnsafeGetStatus() - { - if (source == null) - { - return status; - } - - return source.UnsafeGetStatus(); - } - } - - public readonly struct Awaiter : ICriticalNotifyCompletion - { - readonly UniTask task; - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Awaiter(in UniTask task) - { - this.task = task; - } - - public bool IsCompleted - { - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return task.Status.IsCompleted(); - } - } - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public T GetResult() - { - var s = task.source; - if (s == null) - { - return task.result; - } - else - { - return s.GetResult(task.token); - } - } - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void OnCompleted(Action continuation) - { - var s = task.source; - if (s == null) - { - continuation(); - } - else - { - s.OnCompleted(AwaiterActions.InvokeContinuationDelegate, continuation, task.token); - } - } - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void UnsafeOnCompleted(Action continuation) - { - var s = task.source; - if (s == null) - { - continuation(); - } - else - { - s.OnCompleted(AwaiterActions.InvokeContinuationDelegate, continuation, task.token); - } - } - - /// - /// If register manually continuation, you can use it instead of for compiler OnCompleted methods. - /// - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void SourceOnCompleted(Action continuation, object state) - { - var s = task.source; - if (s == null) - { - continuation(state); - } - else - { - s.OnCompleted(continuation, state, task.token); - } - } - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/UniTask.cs.meta b/VirtueSky/UniTask/Runtime/UniTask.cs.meta deleted file mode 100644 index 04eb6b64..00000000 --- a/VirtueSky/UniTask/Runtime/UniTask.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8947adf23181ff04db73829df217ca94 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTaskCompletionSource.cs b/VirtueSky/UniTask/Runtime/UniTaskCompletionSource.cs deleted file mode 100644 index 1bac1509..00000000 --- a/VirtueSky/UniTask/Runtime/UniTaskCompletionSource.cs +++ /dev/null @@ -1,944 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Runtime.CompilerServices; -using System.Runtime.ExceptionServices; -using System.Runtime.InteropServices; -using System.Threading; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks -{ - public interface IResolvePromise - { - bool TrySetResult(); - } - - public interface IResolvePromise - { - bool TrySetResult(T value); - } - - public interface IRejectPromise - { - bool TrySetException(Exception exception); - } - - public interface ICancelPromise - { - bool TrySetCanceled(CancellationToken cancellationToken = default); - } - - public interface IPromise : IResolvePromise, IRejectPromise, ICancelPromise - { - } - - public interface IPromise : IResolvePromise, IRejectPromise, ICancelPromise - { - } - - internal class ExceptionHolder - { - ExceptionDispatchInfo exception; - bool calledGet = false; - - public ExceptionHolder(ExceptionDispatchInfo exception) - { - this.exception = exception; - } - - public ExceptionDispatchInfo GetException() - { - if (!calledGet) - { - calledGet = true; - GC.SuppressFinalize(this); - } - return exception; - } - - ~ExceptionHolder() - { - if (!calledGet) - { - UniTaskScheduler.PublishUnobservedTaskException(exception.SourceException); - } - } - } - - [StructLayout(LayoutKind.Auto)] - public struct UniTaskCompletionSourceCore - { - // Struct Size: TResult + (8 + 2 + 1 + 1 + 8 + 8) - - TResult result; - object error; // ExceptionHolder or OperationCanceledException - short version; - bool hasUnhandledError; - int completedCount; // 0: completed == false - Action continuation; - object continuationState; - - [DebuggerHidden] - public void Reset() - { - ReportUnhandledError(); - - unchecked - { - version += 1; // incr version. - } - completedCount = 0; - result = default; - error = null; - hasUnhandledError = false; - continuation = null; - continuationState = null; - } - - void ReportUnhandledError() - { - if (hasUnhandledError) - { - try - { - if (error is OperationCanceledException oc) - { - UniTaskScheduler.PublishUnobservedTaskException(oc); - } - else if (error is ExceptionHolder e) - { - UniTaskScheduler.PublishUnobservedTaskException(e.GetException().SourceException); - } - } - catch - { - } - } - } - - internal void MarkHandled() - { - hasUnhandledError = false; - } - - /// Completes with a successful result. - /// The result. - [DebuggerHidden] - public bool TrySetResult(TResult result) - { - if (Interlocked.Increment(ref completedCount) == 1) - { - // setup result - this.result = result; - - if (continuation != null || Interlocked.CompareExchange(ref this.continuation, UniTaskCompletionSourceCoreShared.s_sentinel, null) != null) - { - continuation(continuationState); - } - return true; - } - - return false; - } - - /// Completes with an error. - /// The exception. - [DebuggerHidden] - public bool TrySetException(Exception error) - { - if (Interlocked.Increment(ref completedCount) == 1) - { - // setup result - this.hasUnhandledError = true; - if (error is OperationCanceledException) - { - this.error = error; - } - else - { - this.error = new ExceptionHolder(ExceptionDispatchInfo.Capture(error)); - } - - if (continuation != null || Interlocked.CompareExchange(ref this.continuation, UniTaskCompletionSourceCoreShared.s_sentinel, null) != null) - { - continuation(continuationState); - } - return true; - } - - return false; - } - - [DebuggerHidden] - public bool TrySetCanceled(CancellationToken cancellationToken = default) - { - if (Interlocked.Increment(ref completedCount) == 1) - { - // setup result - this.hasUnhandledError = true; - this.error = new OperationCanceledException(cancellationToken); - - if (continuation != null || Interlocked.CompareExchange(ref this.continuation, UniTaskCompletionSourceCoreShared.s_sentinel, null) != null) - { - continuation(continuationState); - } - return true; - } - - return false; - } - - /// Gets the operation version. - [DebuggerHidden] - public short Version => version; - - /// Gets the status of the operation. - /// Opaque value that was provided to the 's constructor. - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public UniTaskStatus GetStatus(short token) - { - ValidateToken(token); - return (continuation == null || (completedCount == 0)) ? UniTaskStatus.Pending - : (error == null) ? UniTaskStatus.Succeeded - : (error is OperationCanceledException) ? UniTaskStatus.Canceled - : UniTaskStatus.Faulted; - } - - /// Gets the status of the operation without token validation. - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public UniTaskStatus UnsafeGetStatus() - { - return (continuation == null || (completedCount == 0)) ? UniTaskStatus.Pending - : (error == null) ? UniTaskStatus.Succeeded - : (error is OperationCanceledException) ? UniTaskStatus.Canceled - : UniTaskStatus.Faulted; - } - - /// Gets the result of the operation. - /// Opaque value that was provided to the 's constructor. - // [StackTraceHidden] - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public TResult GetResult(short token) - { - ValidateToken(token); - if (completedCount == 0) - { - throw new InvalidOperationException("Not yet completed, UniTask only allow to use await."); - } - - if (error != null) - { - hasUnhandledError = false; - if (error is OperationCanceledException oce) - { - throw oce; - } - else if (error is ExceptionHolder eh) - { - eh.GetException().Throw(); - } - - throw new InvalidOperationException("Critical: invalid exception type was held."); - } - - return result; - } - - /// Schedules the continuation action for this operation. - /// The continuation to invoke when the operation has completed. - /// The state object to pass to when it's invoked. - /// Opaque value that was provided to the 's constructor. - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void OnCompleted(Action continuation, object state, short token /*, ValueTaskSourceOnCompletedFlags flags */) - { - if (continuation == null) - { - throw new ArgumentNullException(nameof(continuation)); - } - ValidateToken(token); - - /* no use ValueTaskSourceOnCOmpletedFlags, always no capture ExecutionContext and SynchronizationContext. */ - - /* - PatternA: GetStatus=Pending => OnCompleted => TrySet*** => GetResult - PatternB: TrySet*** => GetStatus=!Pending => GetResult - PatternC: GetStatus=Pending => TrySet/OnCompleted(race condition) => GetResult - C.1: win OnCompleted -> TrySet invoke saved continuation - C.2: win TrySet -> should invoke continuation here. - */ - - // not set continuation yet. - object oldContinuation = this.continuation; - if (oldContinuation == null) - { - continuationState = state; - oldContinuation = Interlocked.CompareExchange(ref this.continuation, continuation, null); - } - - if (oldContinuation != null) - { - // already running continuation in TrySet. - // It will cause call OnCompleted multiple time, invalid. - if (!ReferenceEquals(oldContinuation, UniTaskCompletionSourceCoreShared.s_sentinel)) - { - throw new InvalidOperationException("Already continuation registered, can not await twice or get Status after await."); - } - - continuation(state); - } - } - - [DebuggerHidden] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void ValidateToken(short token) - { - if (token != version) - { - throw new InvalidOperationException("Token version is not matched, can not await twice or get Status after await."); - } - } - } - - internal static class UniTaskCompletionSourceCoreShared // separated out of generic to avoid unnecessary duplication - { - internal static readonly Action s_sentinel = CompletionSentinel; - - private static void CompletionSentinel(object _) // named method to aid debugging - { - throw new InvalidOperationException("The sentinel delegate should never be invoked."); - } - } - - public class AutoResetUniTaskCompletionSource : IUniTaskSource, ITaskPoolNode, IPromise - { - static TaskPool pool; - AutoResetUniTaskCompletionSource nextNode; - public ref AutoResetUniTaskCompletionSource NextNode => ref nextNode; - - static AutoResetUniTaskCompletionSource() - { - TaskPool.RegisterSizeGetter(typeof(AutoResetUniTaskCompletionSource), () => pool.Size); - } - - UniTaskCompletionSourceCore core; - short version; - - AutoResetUniTaskCompletionSource() - { - } - - [DebuggerHidden] - public static AutoResetUniTaskCompletionSource Create() - { - if (!pool.TryPop(out var result)) - { - result = new AutoResetUniTaskCompletionSource(); - } - result.version = result.core.Version; - TaskTracker.TrackActiveTask(result, 2); - return result; - } - - [DebuggerHidden] - public static AutoResetUniTaskCompletionSource CreateFromCanceled(CancellationToken cancellationToken, out short token) - { - var source = Create(); - source.TrySetCanceled(cancellationToken); - token = source.core.Version; - return source; - } - - [DebuggerHidden] - public static AutoResetUniTaskCompletionSource CreateFromException(Exception exception, out short token) - { - var source = Create(); - source.TrySetException(exception); - token = source.core.Version; - return source; - } - - [DebuggerHidden] - public static AutoResetUniTaskCompletionSource CreateCompleted(out short token) - { - var source = Create(); - source.TrySetResult(); - token = source.core.Version; - return source; - } - - public UniTask Task - { - [DebuggerHidden] - get - { - return new UniTask(this, core.Version); - } - } - - [DebuggerHidden] - public bool TrySetResult() - { - return version == core.Version && core.TrySetResult(AsyncUnit.Default); - } - - [DebuggerHidden] - public bool TrySetCanceled(CancellationToken cancellationToken = default) - { - return version == core.Version && core.TrySetCanceled(cancellationToken); - } - - [DebuggerHidden] - public bool TrySetException(Exception exception) - { - return version == core.Version && core.TrySetException(exception); - } - - [DebuggerHidden] - public void GetResult(short token) - { - try - { - core.GetResult(token); - } - finally - { - TryReturn(); - } - } - - [DebuggerHidden] - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - [DebuggerHidden] - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - [DebuggerHidden] - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - [DebuggerHidden] - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - return pool.TryPush(this); - } - } - - public class AutoResetUniTaskCompletionSource : IUniTaskSource, ITaskPoolNode>, IPromise - { - static TaskPool> pool; - AutoResetUniTaskCompletionSource nextNode; - public ref AutoResetUniTaskCompletionSource NextNode => ref nextNode; - - static AutoResetUniTaskCompletionSource() - { - TaskPool.RegisterSizeGetter(typeof(AutoResetUniTaskCompletionSource), () => pool.Size); - } - - UniTaskCompletionSourceCore core; - short version; - - AutoResetUniTaskCompletionSource() - { - } - - [DebuggerHidden] - public static AutoResetUniTaskCompletionSource Create() - { - if (!pool.TryPop(out var result)) - { - result = new AutoResetUniTaskCompletionSource(); - } - result.version = result.core.Version; - TaskTracker.TrackActiveTask(result, 2); - return result; - } - - [DebuggerHidden] - public static AutoResetUniTaskCompletionSource CreateFromCanceled(CancellationToken cancellationToken, out short token) - { - var source = Create(); - source.TrySetCanceled(cancellationToken); - token = source.core.Version; - return source; - } - - [DebuggerHidden] - public static AutoResetUniTaskCompletionSource CreateFromException(Exception exception, out short token) - { - var source = Create(); - source.TrySetException(exception); - token = source.core.Version; - return source; - } - - [DebuggerHidden] - public static AutoResetUniTaskCompletionSource CreateFromResult(T result, out short token) - { - var source = Create(); - source.TrySetResult(result); - token = source.core.Version; - return source; - } - - public UniTask Task - { - [DebuggerHidden] - get - { - return new UniTask(this, core.Version); - } - } - - [DebuggerHidden] - public bool TrySetResult(T result) - { - return version == core.Version && core.TrySetResult(result); - } - - [DebuggerHidden] - public bool TrySetCanceled(CancellationToken cancellationToken = default) - { - return version == core.Version && core.TrySetCanceled(cancellationToken); - } - - [DebuggerHidden] - public bool TrySetException(Exception exception) - { - return version == core.Version && core.TrySetException(exception); - } - - [DebuggerHidden] - public T GetResult(short token) - { - try - { - return core.GetResult(token); - } - finally - { - TryReturn(); - } - } - - [DebuggerHidden] - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - [DebuggerHidden] - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - [DebuggerHidden] - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - [DebuggerHidden] - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - [DebuggerHidden] - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - return pool.TryPush(this); - } - } - - public class UniTaskCompletionSource : IUniTaskSource, IPromise - { - CancellationToken cancellationToken; - ExceptionHolder exception; - object gate; - Action singleContinuation; - object singleState; - List<(Action, object)> secondaryContinuationList; - - int intStatus; // UniTaskStatus - bool handled = false; - - public UniTaskCompletionSource() - { - TaskTracker.TrackActiveTask(this, 2); - } - - [DebuggerHidden] - internal void MarkHandled() - { - if (!handled) - { - handled = true; - TaskTracker.RemoveTracking(this); - } - } - - public UniTask Task - { - [DebuggerHidden] - get - { - return new UniTask(this, 0); - } - } - - [DebuggerHidden] - public bool TrySetResult() - { - return TrySignalCompletion(UniTaskStatus.Succeeded); - } - - [DebuggerHidden] - public bool TrySetCanceled(CancellationToken cancellationToken = default) - { - if (UnsafeGetStatus() != UniTaskStatus.Pending) return false; - - this.cancellationToken = cancellationToken; - return TrySignalCompletion(UniTaskStatus.Canceled); - } - - [DebuggerHidden] - public bool TrySetException(Exception exception) - { - if (exception is OperationCanceledException oce) - { - return TrySetCanceled(oce.CancellationToken); - } - - if (UnsafeGetStatus() != UniTaskStatus.Pending) return false; - - this.exception = new ExceptionHolder(ExceptionDispatchInfo.Capture(exception)); - return TrySignalCompletion(UniTaskStatus.Faulted); - } - - [DebuggerHidden] - public void GetResult(short token) - { - MarkHandled(); - - var status = (UniTaskStatus)intStatus; - switch (status) - { - case UniTaskStatus.Succeeded: - return; - case UniTaskStatus.Faulted: - exception.GetException().Throw(); - return; - case UniTaskStatus.Canceled: - throw new OperationCanceledException(cancellationToken); - default: - case UniTaskStatus.Pending: - throw new InvalidOperationException("not yet completed."); - } - } - - [DebuggerHidden] - public UniTaskStatus GetStatus(short token) - { - return (UniTaskStatus)intStatus; - } - - [DebuggerHidden] - public UniTaskStatus UnsafeGetStatus() - { - return (UniTaskStatus)intStatus; - } - - [DebuggerHidden] - public void OnCompleted(Action continuation, object state, short token) - { - if (gate == null) - { - Interlocked.CompareExchange(ref gate, new object(), null); - } - - var lockGate = Thread.VolatileRead(ref gate); - lock (lockGate) // wait TrySignalCompletion, after status is not pending. - { - if ((UniTaskStatus)intStatus != UniTaskStatus.Pending) - { - continuation(state); - return; - } - - if (singleContinuation == null) - { - singleContinuation = continuation; - singleState = state; - } - else - { - if (secondaryContinuationList == null) - { - secondaryContinuationList = new List<(Action, object)>(); - } - secondaryContinuationList.Add((continuation, state)); - } - } - } - - [DebuggerHidden] - bool TrySignalCompletion(UniTaskStatus status) - { - if (Interlocked.CompareExchange(ref intStatus, (int)status, (int)UniTaskStatus.Pending) == (int)UniTaskStatus.Pending) - { - if (gate == null) - { - Interlocked.CompareExchange(ref gate, new object(), null); - } - - var lockGate = Thread.VolatileRead(ref gate); - lock (lockGate) // wait OnCompleted. - { - if (singleContinuation != null) - { - try - { - singleContinuation(singleState); - } - catch (Exception ex) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - } - } - - if (secondaryContinuationList != null) - { - foreach (var (c, state) in secondaryContinuationList) - { - try - { - c(state); - } - catch (Exception ex) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - } - } - } - - singleContinuation = null; - singleState = null; - secondaryContinuationList = null; - } - return true; - } - return false; - } - } - - public class UniTaskCompletionSource : IUniTaskSource, IPromise - { - CancellationToken cancellationToken; - T result; - ExceptionHolder exception; - object gate; - Action singleContinuation; - object singleState; - List<(Action, object)> secondaryContinuationList; - - int intStatus; // UniTaskStatus - bool handled = false; - - public UniTaskCompletionSource() - { - TaskTracker.TrackActiveTask(this, 2); - } - - [DebuggerHidden] - internal void MarkHandled() - { - if (!handled) - { - handled = true; - TaskTracker.RemoveTracking(this); - } - } - - public UniTask Task - { - [DebuggerHidden] - get - { - return new UniTask(this, 0); - } - } - - [DebuggerHidden] - public bool TrySetResult(T result) - { - if (UnsafeGetStatus() != UniTaskStatus.Pending) return false; - - this.result = result; - return TrySignalCompletion(UniTaskStatus.Succeeded); - } - - [DebuggerHidden] - public bool TrySetCanceled(CancellationToken cancellationToken = default) - { - if (UnsafeGetStatus() != UniTaskStatus.Pending) return false; - - this.cancellationToken = cancellationToken; - return TrySignalCompletion(UniTaskStatus.Canceled); - } - - [DebuggerHidden] - public bool TrySetException(Exception exception) - { - if (exception is OperationCanceledException oce) - { - return TrySetCanceled(oce.CancellationToken); - } - - if (UnsafeGetStatus() != UniTaskStatus.Pending) return false; - - this.exception = new ExceptionHolder(ExceptionDispatchInfo.Capture(exception)); - return TrySignalCompletion(UniTaskStatus.Faulted); - } - - [DebuggerHidden] - public T GetResult(short token) - { - MarkHandled(); - - var status = (UniTaskStatus)intStatus; - switch (status) - { - case UniTaskStatus.Succeeded: - return result; - case UniTaskStatus.Faulted: - exception.GetException().Throw(); - return default; - case UniTaskStatus.Canceled: - throw new OperationCanceledException(cancellationToken); - default: - case UniTaskStatus.Pending: - throw new InvalidOperationException("not yet completed."); - } - } - - [DebuggerHidden] - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - [DebuggerHidden] - public UniTaskStatus GetStatus(short token) - { - return (UniTaskStatus)intStatus; - } - - [DebuggerHidden] - public UniTaskStatus UnsafeGetStatus() - { - return (UniTaskStatus)intStatus; - } - - [DebuggerHidden] - public void OnCompleted(Action continuation, object state, short token) - { - if (gate == null) - { - Interlocked.CompareExchange(ref gate, new object(), null); - } - - var lockGate = Thread.VolatileRead(ref gate); - lock (lockGate) // wait TrySignalCompletion, after status is not pending. - { - if ((UniTaskStatus)intStatus != UniTaskStatus.Pending) - { - continuation(state); - return; - } - - if (singleContinuation == null) - { - singleContinuation = continuation; - singleState = state; - } - else - { - if (secondaryContinuationList == null) - { - secondaryContinuationList = new List<(Action, object)>(); - } - secondaryContinuationList.Add((continuation, state)); - } - } - } - - [DebuggerHidden] - bool TrySignalCompletion(UniTaskStatus status) - { - if (Interlocked.CompareExchange(ref intStatus, (int)status, (int)UniTaskStatus.Pending) == (int)UniTaskStatus.Pending) - { - if (gate == null) - { - Interlocked.CompareExchange(ref gate, new object(), null); - } - - var lockGate = Thread.VolatileRead(ref gate); - lock (lockGate) // wait OnCompleted. - { - if (singleContinuation != null) - { - try - { - singleContinuation(singleState); - } - catch (Exception ex) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - } - } - - if (secondaryContinuationList != null) - { - foreach (var (c, state) in secondaryContinuationList) - { - try - { - c(state); - } - catch (Exception ex) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - } - } - } - - singleContinuation = null; - singleState = null; - secondaryContinuationList = null; - } - return true; - } - return false; - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/UniTaskCompletionSource.cs.meta b/VirtueSky/UniTask/Runtime/UniTaskCompletionSource.cs.meta deleted file mode 100644 index 2ae5ee31..00000000 --- a/VirtueSky/UniTask/Runtime/UniTaskCompletionSource.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ed03524d09e7eb24a9fb9137198feb84 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTaskExtensions.Shorthand.cs b/VirtueSky/UniTask/Runtime/UniTaskExtensions.Shorthand.cs deleted file mode 100644 index c9b135e0..00000000 --- a/VirtueSky/UniTask/Runtime/UniTaskExtensions.Shorthand.cs +++ /dev/null @@ -1,187 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -using System.Collections.Generic; - -namespace VirtueSky.Threading.Tasks -{ - public static partial class UniTaskExtensions - { - // shorthand of WhenAll - - public static UniTask.Awaiter GetAwaiter(this UniTask[] tasks) - { - return UniTask.WhenAll(tasks).GetAwaiter(); - } - - public static UniTask.Awaiter GetAwaiter(this IEnumerable tasks) - { - return UniTask.WhenAll(tasks).GetAwaiter(); - } - - public static UniTask.Awaiter GetAwaiter(this UniTask[] tasks) - { - return UniTask.WhenAll(tasks).GetAwaiter(); - } - - public static UniTask.Awaiter GetAwaiter(this IEnumerable> tasks) - { - return UniTask.WhenAll(tasks).GetAwaiter(); - } - - public static UniTask<(T1, T2)>.Awaiter GetAwaiter(this (UniTask task1, UniTask task2) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2).GetAwaiter(); - } - - public static UniTask<(T1, T2, T3)>.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3).GetAwaiter(); - } - - public static UniTask<(T1, T2, T3, T4)>.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4).GetAwaiter(); - } - - public static UniTask<(T1, T2, T3, T4, T5)>.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5).GetAwaiter(); - } - - public static UniTask<(T1, T2, T3, T4, T5, T6)>.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6).GetAwaiter(); - } - - public static UniTask<(T1, T2, T3, T4, T5, T6, T7)>.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7).GetAwaiter(); - } - - public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8)>.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8).GetAwaiter(); - } - - public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9)>.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9).GetAwaiter(); - } - - public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10).GetAwaiter(); - } - - public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)>.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11).GetAwaiter(); - } - - public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)>.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11, tasks.Item12).GetAwaiter(); - } - - public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)>.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11, tasks.Item12, tasks.Item13).GetAwaiter(); - } - - public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)>.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13, UniTask task14) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11, tasks.Item12, tasks.Item13, tasks.Item14).GetAwaiter(); - } - - public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)>.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13, UniTask task14, UniTask task15) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11, tasks.Item12, tasks.Item13, tasks.Item14, tasks.Item15).GetAwaiter(); - } - - - - public static UniTask.Awaiter GetAwaiter(this (UniTask task1, UniTask task2) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2).GetAwaiter(); - } - - - public static UniTask.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3).GetAwaiter(); - } - - - public static UniTask.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4).GetAwaiter(); - } - - - public static UniTask.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5).GetAwaiter(); - } - - - public static UniTask.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6).GetAwaiter(); - } - - - public static UniTask.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7).GetAwaiter(); - } - - - public static UniTask.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8).GetAwaiter(); - } - - - public static UniTask.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9).GetAwaiter(); - } - - - public static UniTask.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10).GetAwaiter(); - } - - - public static UniTask.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11).GetAwaiter(); - } - - - public static UniTask.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11, tasks.Item12).GetAwaiter(); - } - - - public static UniTask.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11, tasks.Item12, tasks.Item13).GetAwaiter(); - } - - - public static UniTask.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13, UniTask task14) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11, tasks.Item12, tasks.Item13, tasks.Item14).GetAwaiter(); - } - - - public static UniTask.Awaiter GetAwaiter(this (UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13, UniTask task14, UniTask task15) tasks) - { - return UniTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11, tasks.Item12, tasks.Item13, tasks.Item14, tasks.Item15).GetAwaiter(); - } - - - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/UniTaskExtensions.Shorthand.cs.meta b/VirtueSky/UniTask/Runtime/UniTaskExtensions.Shorthand.cs.meta deleted file mode 100644 index e2dcc142..00000000 --- a/VirtueSky/UniTask/Runtime/UniTaskExtensions.Shorthand.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4b4ff020f73dc6d4b8ebd4760d61fb43 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTaskExtensions.cs b/VirtueSky/UniTask/Runtime/UniTaskExtensions.cs deleted file mode 100644 index 92e0af39..00000000 --- a/VirtueSky/UniTask/Runtime/UniTaskExtensions.cs +++ /dev/null @@ -1,921 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Collections; -using System.Runtime.ExceptionServices; -using System.Threading; -using System.Threading.Tasks; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks -{ - public static partial class UniTaskExtensions - { - /// - /// Convert Task[T] -> UniTask[T]. - /// - public static UniTask AsUniTask(this Task task, bool useCurrentSynchronizationContext = true) - { - var promise = new UniTaskCompletionSource(); - - task.ContinueWith((x, state) => - { - var p = (UniTaskCompletionSource)state; - - switch (x.Status) - { - case TaskStatus.Canceled: - p.TrySetCanceled(); - break; - case TaskStatus.Faulted: - p.TrySetException(x.Exception.InnerException ?? x.Exception); - break; - case TaskStatus.RanToCompletion: - p.TrySetResult(x.Result); - break; - default: - throw new NotSupportedException(); - } - }, promise, useCurrentSynchronizationContext ? TaskScheduler.FromCurrentSynchronizationContext() : TaskScheduler.Current); - - return promise.Task; - } - - /// - /// Convert Task -> UniTask. - /// - public static UniTask AsUniTask(this Task task, bool useCurrentSynchronizationContext = true) - { - var promise = new UniTaskCompletionSource(); - - task.ContinueWith((x, state) => - { - var p = (UniTaskCompletionSource)state; - - switch (x.Status) - { - case TaskStatus.Canceled: - p.TrySetCanceled(); - break; - case TaskStatus.Faulted: - p.TrySetException(x.Exception.InnerException ?? x.Exception); - break; - case TaskStatus.RanToCompletion: - p.TrySetResult(); - break; - default: - throw new NotSupportedException(); - } - }, promise, useCurrentSynchronizationContext ? TaskScheduler.FromCurrentSynchronizationContext() : TaskScheduler.Current); - - return promise.Task; - } - - public static Task AsTask(this UniTask task) - { - try - { - UniTask.Awaiter awaiter; - try - { - awaiter = task.GetAwaiter(); - } - catch (Exception ex) - { - return Task.FromException(ex); - } - - if (awaiter.IsCompleted) - { - try - { - var result = awaiter.GetResult(); - return Task.FromResult(result); - } - catch (Exception ex) - { - return Task.FromException(ex); - } - } - - var tcs = new TaskCompletionSource(); - - awaiter.SourceOnCompleted(state => - { - using (var tuple = (StateTuple, UniTask.Awaiter>)state) - { - var (inTcs, inAwaiter) = tuple; - try - { - var result = inAwaiter.GetResult(); - inTcs.SetResult(result); - } - catch (Exception ex) - { - inTcs.SetException(ex); - } - } - }, StateTuple.Create(tcs, awaiter)); - - return tcs.Task; - } - catch (Exception ex) - { - return Task.FromException(ex); - } - } - - public static Task AsTask(this UniTask task) - { - try - { - UniTask.Awaiter awaiter; - try - { - awaiter = task.GetAwaiter(); - } - catch (Exception ex) - { - return Task.FromException(ex); - } - - if (awaiter.IsCompleted) - { - try - { - awaiter.GetResult(); // check token valid on Succeeded - return Task.CompletedTask; - } - catch (Exception ex) - { - return Task.FromException(ex); - } - } - - var tcs = new TaskCompletionSource(); - - awaiter.SourceOnCompleted(state => - { - using (var tuple = (StateTuple, UniTask.Awaiter>)state) - { - var (inTcs, inAwaiter) = tuple; - try - { - inAwaiter.GetResult(); - inTcs.SetResult(null); - } - catch (Exception ex) - { - inTcs.SetException(ex); - } - } - }, StateTuple.Create(tcs, awaiter)); - - return tcs.Task; - } - catch (Exception ex) - { - return Task.FromException(ex); - } - } - - public static AsyncLazy ToAsyncLazy(this UniTask task) - { - return new AsyncLazy(task); - } - - public static AsyncLazy ToAsyncLazy(this UniTask task) - { - return new AsyncLazy(task); - } - - /// - /// Ignore task result when cancel raised first. - /// - public static UniTask AttachExternalCancellation(this UniTask task, CancellationToken cancellationToken) - { - if (!cancellationToken.CanBeCanceled) - { - return task; - } - - if (cancellationToken.IsCancellationRequested) - { - return UniTask.FromCanceled(cancellationToken); - } - - if (task.Status.IsCompleted()) - { - return task; - } - - return new UniTask(new AttachExternalCancellationSource(task, cancellationToken), 0); - } - - /// - /// Ignore task result when cancel raised first. - /// - public static UniTask AttachExternalCancellation(this UniTask task, CancellationToken cancellationToken) - { - if (!cancellationToken.CanBeCanceled) - { - return task; - } - - if (cancellationToken.IsCancellationRequested) - { - return UniTask.FromCanceled(cancellationToken); - } - - if (task.Status.IsCompleted()) - { - return task; - } - - return new UniTask(new AttachExternalCancellationSource(task, cancellationToken), 0); - } - - sealed class AttachExternalCancellationSource : IUniTaskSource - { - static readonly Action cancellationCallbackDelegate = CancellationCallback; - - CancellationToken cancellationToken; - CancellationTokenRegistration tokenRegistration; - UniTaskCompletionSourceCore core; - - public AttachExternalCancellationSource(UniTask task, CancellationToken cancellationToken) - { - this.cancellationToken = cancellationToken; - this.tokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallbackDelegate, this); - RunTask(task).Forget(); - } - - async UniTaskVoid RunTask(UniTask task) - { - try - { - await task; - core.TrySetResult(AsyncUnit.Default); - } - catch (Exception ex) - { - core.TrySetException(ex); - } - finally - { - tokenRegistration.Dispose(); - } - } - - static void CancellationCallback(object state) - { - var self = (AttachExternalCancellationSource)state; - self.core.TrySetCanceled(self.cancellationToken); - } - - public void GetResult(short token) - { - core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - } - - sealed class AttachExternalCancellationSource : IUniTaskSource - { - static readonly Action cancellationCallbackDelegate = CancellationCallback; - - CancellationToken cancellationToken; - CancellationTokenRegistration tokenRegistration; - UniTaskCompletionSourceCore core; - - public AttachExternalCancellationSource(UniTask task, CancellationToken cancellationToken) - { - this.cancellationToken = cancellationToken; - this.tokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallbackDelegate, this); - RunTask(task).Forget(); - } - - async UniTaskVoid RunTask(UniTask task) - { - try - { - core.TrySetResult(await task); - } - catch (Exception ex) - { - core.TrySetException(ex); - } - finally - { - tokenRegistration.Dispose(); - } - } - - static void CancellationCallback(object state) - { - var self = (AttachExternalCancellationSource)state; - self.core.TrySetCanceled(self.cancellationToken); - } - - void IUniTaskSource.GetResult(short token) - { - core.GetResult(token); - } - - public T GetResult(short token) - { - return core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - } - -#if UNITY_2018_3_OR_NEWER - - public static IEnumerator ToCoroutine(this UniTask task, Action resultHandler = null, Action exceptionHandler = null) - { - return new ToCoroutineEnumerator(task, resultHandler, exceptionHandler); - } - - public static IEnumerator ToCoroutine(this UniTask task, Action exceptionHandler = null) - { - return new ToCoroutineEnumerator(task, exceptionHandler); - } - - public static async UniTask Timeout(this UniTask task, TimeSpan timeout, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update, CancellationTokenSource taskCancellationTokenSource = null) - { - var delayCancellationTokenSource = new CancellationTokenSource(); - var timeoutTask = UniTask.Delay(timeout, delayType, timeoutCheckTiming, delayCancellationTokenSource.Token).SuppressCancellationThrow(); - - int winArgIndex; - bool taskResultIsCanceled; - try - { - (winArgIndex, taskResultIsCanceled, _) = await UniTask.WhenAny(task.SuppressCancellationThrow(), timeoutTask); - } - catch - { - delayCancellationTokenSource.Cancel(); - delayCancellationTokenSource.Dispose(); - throw; - } - - // timeout - if (winArgIndex == 1) - { - if (taskCancellationTokenSource != null) - { - taskCancellationTokenSource.Cancel(); - taskCancellationTokenSource.Dispose(); - } - - throw new TimeoutException("Exceed Timeout:" + timeout); - } - else - { - delayCancellationTokenSource.Cancel(); - delayCancellationTokenSource.Dispose(); - } - - if (taskResultIsCanceled) - { - Error.ThrowOperationCanceledException(); - } - } - - public static async UniTask Timeout(this UniTask task, TimeSpan timeout, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update, CancellationTokenSource taskCancellationTokenSource = null) - { - var delayCancellationTokenSource = new CancellationTokenSource(); - var timeoutTask = UniTask.Delay(timeout, delayType, timeoutCheckTiming, delayCancellationTokenSource.Token).SuppressCancellationThrow(); - - int winArgIndex; - (bool IsCanceled, T Result) taskResult; - try - { - (winArgIndex, taskResult, _) = await UniTask.WhenAny(task.SuppressCancellationThrow(), timeoutTask); - } - catch - { - delayCancellationTokenSource.Cancel(); - delayCancellationTokenSource.Dispose(); - throw; - } - - // timeout - if (winArgIndex == 1) - { - if (taskCancellationTokenSource != null) - { - taskCancellationTokenSource.Cancel(); - taskCancellationTokenSource.Dispose(); - } - - throw new TimeoutException("Exceed Timeout:" + timeout); - } - else - { - delayCancellationTokenSource.Cancel(); - delayCancellationTokenSource.Dispose(); - } - - if (taskResult.IsCanceled) - { - Error.ThrowOperationCanceledException(); - } - - return taskResult.Result; - } - - /// - /// Timeout with suppress OperationCanceledException. Returns (bool, IsCanceled). - /// - public static async UniTask TimeoutWithoutException(this UniTask task, TimeSpan timeout, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update, CancellationTokenSource taskCancellationTokenSource = null) - { - var delayCancellationTokenSource = new CancellationTokenSource(); - var timeoutTask = UniTask.Delay(timeout, delayType, timeoutCheckTiming, delayCancellationTokenSource.Token).SuppressCancellationThrow(); - - int winArgIndex; - bool taskResultIsCanceled; - try - { - (winArgIndex, taskResultIsCanceled, _) = await UniTask.WhenAny(task.SuppressCancellationThrow(), timeoutTask); - } - catch - { - delayCancellationTokenSource.Cancel(); - delayCancellationTokenSource.Dispose(); - return true; - } - - // timeout - if (winArgIndex == 1) - { - if (taskCancellationTokenSource != null) - { - taskCancellationTokenSource.Cancel(); - taskCancellationTokenSource.Dispose(); - } - - return true; - } - else - { - delayCancellationTokenSource.Cancel(); - delayCancellationTokenSource.Dispose(); - } - - if (taskResultIsCanceled) - { - return true; - } - - return false; - } - - /// - /// Timeout with suppress OperationCanceledException. Returns (bool IsTimeout, T Result). - /// - public static async UniTask<(bool IsTimeout, T Result)> TimeoutWithoutException(this UniTask task, TimeSpan timeout, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update, CancellationTokenSource taskCancellationTokenSource = null) - { - var delayCancellationTokenSource = new CancellationTokenSource(); - var timeoutTask = UniTask.Delay(timeout, delayType, timeoutCheckTiming, delayCancellationTokenSource.Token).SuppressCancellationThrow(); - - int winArgIndex; - (bool IsCanceled, T Result) taskResult; - try - { - (winArgIndex, taskResult, _) = await UniTask.WhenAny(task.SuppressCancellationThrow(), timeoutTask); - } - catch - { - delayCancellationTokenSource.Cancel(); - delayCancellationTokenSource.Dispose(); - return (true, default); - } - - // timeout - if (winArgIndex == 1) - { - if (taskCancellationTokenSource != null) - { - taskCancellationTokenSource.Cancel(); - taskCancellationTokenSource.Dispose(); - } - - return (true, default); - } - else - { - delayCancellationTokenSource.Cancel(); - delayCancellationTokenSource.Dispose(); - } - - if (taskResult.IsCanceled) - { - return (true, default); - } - - return (false, taskResult.Result); - } - -#endif - - public static void Forget(this UniTask task) - { - var awaiter = task.GetAwaiter(); - if (awaiter.IsCompleted) - { - try - { - awaiter.GetResult(); - } - catch (Exception ex) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - } - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple)state) - { - try - { - t.Item1.GetResult(); - } - catch (Exception ex) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - } - } - }, StateTuple.Create(awaiter)); - } - } - - public static void Forget(this UniTask task, Action exceptionHandler, bool handleExceptionOnMainThread = true) - { - if (exceptionHandler == null) - { - Forget(task); - } - else - { - ForgetCoreWithCatch(task, exceptionHandler, handleExceptionOnMainThread).Forget(); - } - } - - static async UniTaskVoid ForgetCoreWithCatch(UniTask task, Action exceptionHandler, bool handleExceptionOnMainThread) - { - try - { - await task; - } - catch (Exception ex) - { - try - { - if (handleExceptionOnMainThread) - { -#if UNITY_2018_3_OR_NEWER - await UniTask.SwitchToMainThread(); -#endif - } - exceptionHandler(ex); - } - catch (Exception ex2) - { - UniTaskScheduler.PublishUnobservedTaskException(ex2); - } - } - } - - public static void Forget(this UniTask task) - { - var awaiter = task.GetAwaiter(); - if (awaiter.IsCompleted) - { - try - { - awaiter.GetResult(); - } - catch (Exception ex) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - } - } - else - { - awaiter.SourceOnCompleted(state => - { - using (var t = (StateTuple.Awaiter>)state) - { - try - { - t.Item1.GetResult(); - } - catch (Exception ex) - { - UniTaskScheduler.PublishUnobservedTaskException(ex); - } - } - }, StateTuple.Create(awaiter)); - } - } - - public static void Forget(this UniTask task, Action exceptionHandler, bool handleExceptionOnMainThread = true) - { - if (exceptionHandler == null) - { - task.Forget(); - } - else - { - ForgetCoreWithCatch(task, exceptionHandler, handleExceptionOnMainThread).Forget(); - } - } - - static async UniTaskVoid ForgetCoreWithCatch(UniTask task, Action exceptionHandler, bool handleExceptionOnMainThread) - { - try - { - await task; - } - catch (Exception ex) - { - try - { - if (handleExceptionOnMainThread) - { -#if UNITY_2018_3_OR_NEWER - await UniTask.SwitchToMainThread(); -#endif - } - exceptionHandler(ex); - } - catch (Exception ex2) - { - UniTaskScheduler.PublishUnobservedTaskException(ex2); - } - } - } - - public static async UniTask ContinueWith(this UniTask task, Action continuationFunction) - { - continuationFunction(await task); - } - - public static async UniTask ContinueWith(this UniTask task, Func continuationFunction) - { - await continuationFunction(await task); - } - - public static async UniTask ContinueWith(this UniTask task, Func continuationFunction) - { - return continuationFunction(await task); - } - - public static async UniTask ContinueWith(this UniTask task, Func> continuationFunction) - { - return await continuationFunction(await task); - } - - public static async UniTask ContinueWith(this UniTask task, Action continuationFunction) - { - await task; - continuationFunction(); - } - - public static async UniTask ContinueWith(this UniTask task, Func continuationFunction) - { - await task; - await continuationFunction(); - } - - public static async UniTask ContinueWith(this UniTask task, Func continuationFunction) - { - await task; - return continuationFunction(); - } - - public static async UniTask ContinueWith(this UniTask task, Func> continuationFunction) - { - await task; - return await continuationFunction(); - } - - public static async UniTask Unwrap(this UniTask> task) - { - return await await task; - } - - public static async UniTask Unwrap(this UniTask task) - { - await await task; - } - - public static async UniTask Unwrap(this Task> task) - { - return await await task; - } - - public static async UniTask Unwrap(this Task> task, bool continueOnCapturedContext) - { - return await await task.ConfigureAwait(continueOnCapturedContext); - } - - public static async UniTask Unwrap(this Task task) - { - await await task; - } - - public static async UniTask Unwrap(this Task task, bool continueOnCapturedContext) - { - await await task.ConfigureAwait(continueOnCapturedContext); - } - - public static async UniTask Unwrap(this UniTask> task) - { - return await await task; - } - - public static async UniTask Unwrap(this UniTask> task, bool continueOnCapturedContext) - { - return await (await task).ConfigureAwait(continueOnCapturedContext); - } - - public static async UniTask Unwrap(this UniTask task) - { - await await task; - } - - public static async UniTask Unwrap(this UniTask task, bool continueOnCapturedContext) - { - await (await task).ConfigureAwait(continueOnCapturedContext); - } - -#if UNITY_2018_3_OR_NEWER - - sealed class ToCoroutineEnumerator : IEnumerator - { - bool completed; - UniTask task; - Action exceptionHandler = null; - bool isStarted = false; - ExceptionDispatchInfo exception; - - public ToCoroutineEnumerator(UniTask task, Action exceptionHandler) - { - completed = false; - this.exceptionHandler = exceptionHandler; - this.task = task; - } - - async UniTaskVoid RunTask(UniTask task) - { - try - { - await task; - } - catch (Exception ex) - { - if (exceptionHandler != null) - { - exceptionHandler(ex); - } - else - { - this.exception = ExceptionDispatchInfo.Capture(ex); - } - } - finally - { - completed = true; - } - } - - public object Current => null; - - public bool MoveNext() - { - if (!isStarted) - { - isStarted = true; - RunTask(task).Forget(); - } - - if (exception != null) - { - exception.Throw(); - return false; - } - - return !completed; - } - - void IEnumerator.Reset() - { - } - } - - sealed class ToCoroutineEnumerator : IEnumerator - { - bool completed; - Action resultHandler = null; - Action exceptionHandler = null; - bool isStarted = false; - UniTask task; - object current = null; - ExceptionDispatchInfo exception; - - public ToCoroutineEnumerator(UniTask task, Action resultHandler, Action exceptionHandler) - { - completed = false; - this.task = task; - this.resultHandler = resultHandler; - this.exceptionHandler = exceptionHandler; - } - - async UniTaskVoid RunTask(UniTask task) - { - try - { - var value = await task; - current = value; // boxed if T is struct... - if (resultHandler != null) - { - resultHandler(value); - } - } - catch (Exception ex) - { - if (exceptionHandler != null) - { - exceptionHandler(ex); - } - else - { - this.exception = ExceptionDispatchInfo.Capture(ex); - } - } - finally - { - completed = true; - } - } - - public object Current => current; - - public bool MoveNext() - { - if (!isStarted) - { - isStarted = true; - RunTask(task).Forget(); - } - - if (exception != null) - { - exception.Throw(); - return false; - } - - return !completed; - } - - void IEnumerator.Reset() - { - } - } - -#endif - } -} - diff --git a/VirtueSky/UniTask/Runtime/UniTaskExtensions.cs.meta b/VirtueSky/UniTask/Runtime/UniTaskExtensions.cs.meta deleted file mode 100644 index 0d229460..00000000 --- a/VirtueSky/UniTask/Runtime/UniTaskExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 05460c617dae1e440861a7438535389f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTaskObservableExtensions.cs b/VirtueSky/UniTask/Runtime/UniTaskObservableExtensions.cs deleted file mode 100644 index 92598c7e..00000000 --- a/VirtueSky/UniTask/Runtime/UniTaskObservableExtensions.cs +++ /dev/null @@ -1,750 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Runtime.ExceptionServices; -using System.Threading; -using VirtueSky.Threading.Tasks.Internal; - -namespace VirtueSky.Threading.Tasks -{ - public static class UniTaskObservableExtensions - { - public static UniTask ToUniTask(this IObservable source, bool useFirstValue = false, CancellationToken cancellationToken = default) - { - var promise = new UniTaskCompletionSource(); - var disposable = new SingleAssignmentDisposable(); - - var observer = useFirstValue - ? (IObserver)new FirstValueToUniTaskObserver(promise, disposable, cancellationToken) - : (IObserver)new ToUniTaskObserver(promise, disposable, cancellationToken); - - try - { - disposable.Disposable = source.Subscribe(observer); - } - catch (Exception ex) - { - promise.TrySetException(ex); - } - - return promise.Task; - } - - public static IObservable ToObservable(this UniTask task) - { - if (task.Status.IsCompleted()) - { - try - { - return new ReturnObservable(task.GetAwaiter().GetResult()); - } - catch (Exception ex) - { - return new ThrowObservable(ex); - } - } - - var subject = new AsyncSubject(); - Fire(subject, task).Forget(); - return subject; - } - - /// - /// Ideally returns IObservabl[Unit] is best but Cysharp.Threading.Tasks does not have Unit so return AsyncUnit instead. - /// - public static IObservable ToObservable(this UniTask task) - { - if (task.Status.IsCompleted()) - { - try - { - task.GetAwaiter().GetResult(); - return new ReturnObservable(AsyncUnit.Default); - } - catch (Exception ex) - { - return new ThrowObservable(ex); - } - } - - var subject = new AsyncSubject(); - Fire(subject, task).Forget(); - return subject; - } - - static async UniTaskVoid Fire(AsyncSubject subject, UniTask task) - { - T value; - try - { - value = await task; - } - catch (Exception ex) - { - subject.OnError(ex); - return; - } - - subject.OnNext(value); - subject.OnCompleted(); - } - - static async UniTaskVoid Fire(AsyncSubject subject, UniTask task) - { - try - { - await task; - } - catch (Exception ex) - { - subject.OnError(ex); - return; - } - - subject.OnNext(AsyncUnit.Default); - subject.OnCompleted(); - } - - class ToUniTaskObserver : IObserver - { - static readonly Action callback = OnCanceled; - - readonly UniTaskCompletionSource promise; - readonly SingleAssignmentDisposable disposable; - readonly CancellationToken cancellationToken; - readonly CancellationTokenRegistration registration; - - bool hasValue; - T latestValue; - - public ToUniTaskObserver(UniTaskCompletionSource promise, SingleAssignmentDisposable disposable, CancellationToken cancellationToken) - { - this.promise = promise; - this.disposable = disposable; - this.cancellationToken = cancellationToken; - - if (this.cancellationToken.CanBeCanceled) - { - this.registration = this.cancellationToken.RegisterWithoutCaptureExecutionContext(callback, this); - } - } - - static void OnCanceled(object state) - { - var self = (ToUniTaskObserver)state; - self.disposable.Dispose(); - self.promise.TrySetCanceled(self.cancellationToken); - } - - public void OnNext(T value) - { - hasValue = true; - latestValue = value; - } - - public void OnError(Exception error) - { - try - { - promise.TrySetException(error); - } - finally - { - registration.Dispose(); - disposable.Dispose(); - } - } - - public void OnCompleted() - { - try - { - if (hasValue) - { - promise.TrySetResult(latestValue); - } - else - { - promise.TrySetException(new InvalidOperationException("Sequence has no elements")); - } - } - finally - { - registration.Dispose(); - disposable.Dispose(); - } - } - } - - class FirstValueToUniTaskObserver : IObserver - { - static readonly Action callback = OnCanceled; - - readonly UniTaskCompletionSource promise; - readonly SingleAssignmentDisposable disposable; - readonly CancellationToken cancellationToken; - readonly CancellationTokenRegistration registration; - - bool hasValue; - - public FirstValueToUniTaskObserver(UniTaskCompletionSource promise, SingleAssignmentDisposable disposable, CancellationToken cancellationToken) - { - this.promise = promise; - this.disposable = disposable; - this.cancellationToken = cancellationToken; - - if (this.cancellationToken.CanBeCanceled) - { - this.registration = this.cancellationToken.RegisterWithoutCaptureExecutionContext(callback, this); - } - } - - static void OnCanceled(object state) - { - var self = (FirstValueToUniTaskObserver)state; - self.disposable.Dispose(); - self.promise.TrySetCanceled(self.cancellationToken); - } - - public void OnNext(T value) - { - hasValue = true; - try - { - promise.TrySetResult(value); - } - finally - { - registration.Dispose(); - disposable.Dispose(); - } - } - - public void OnError(Exception error) - { - try - { - promise.TrySetException(error); - } - finally - { - registration.Dispose(); - disposable.Dispose(); - } - } - - public void OnCompleted() - { - try - { - if (!hasValue) - { - promise.TrySetException(new InvalidOperationException("Sequence has no elements")); - } - } - finally - { - registration.Dispose(); - disposable.Dispose(); - } - } - } - - class ReturnObservable : IObservable - { - readonly T value; - - public ReturnObservable(T value) - { - this.value = value; - } - - public IDisposable Subscribe(IObserver observer) - { - observer.OnNext(value); - observer.OnCompleted(); - return EmptyDisposable.Instance; - } - } - - class ThrowObservable : IObservable - { - readonly Exception value; - - public ThrowObservable(Exception value) - { - this.value = value; - } - - public IDisposable Subscribe(IObserver observer) - { - observer.OnError(value); - return EmptyDisposable.Instance; - } - } - } -} - -namespace VirtueSky.Threading.Tasks.Internal -{ - // Bridges for Rx. - - internal class EmptyDisposable : IDisposable - { - public static EmptyDisposable Instance = new EmptyDisposable(); - - EmptyDisposable() - { - - } - - public void Dispose() - { - } - } - - internal sealed class SingleAssignmentDisposable : IDisposable - { - readonly object gate = new object(); - IDisposable current; - bool disposed; - - public bool IsDisposed { get { lock (gate) { return disposed; } } } - - public IDisposable Disposable - { - get - { - return current; - } - set - { - var old = default(IDisposable); - bool alreadyDisposed; - lock (gate) - { - alreadyDisposed = disposed; - old = current; - if (!alreadyDisposed) - { - if (value == null) return; - current = value; - } - } - - if (alreadyDisposed && value != null) - { - value.Dispose(); - return; - } - - if (old != null) throw new InvalidOperationException("Disposable is already set"); - } - } - - - public void Dispose() - { - IDisposable old = null; - - lock (gate) - { - if (!disposed) - { - disposed = true; - old = current; - current = null; - } - } - - if (old != null) old.Dispose(); - } - } - - internal sealed class AsyncSubject : IObservable, IObserver - { - object observerLock = new object(); - - T lastValue; - bool hasValue; - bool isStopped; - bool isDisposed; - Exception lastError; - IObserver outObserver = EmptyObserver.Instance; - - public T Value - { - get - { - ThrowIfDisposed(); - if (!isStopped) throw new InvalidOperationException("AsyncSubject is not completed yet"); - if (lastError != null) ExceptionDispatchInfo.Capture(lastError).Throw(); - return lastValue; - } - } - - public bool HasObservers - { - get - { - return !(outObserver is EmptyObserver) && !isStopped && !isDisposed; - } - } - - public bool IsCompleted { get { return isStopped; } } - - public void OnCompleted() - { - IObserver old; - T v; - bool hv; - lock (observerLock) - { - ThrowIfDisposed(); - if (isStopped) return; - - old = outObserver; - outObserver = EmptyObserver.Instance; - isStopped = true; - v = lastValue; - hv = hasValue; - } - - if (hv) - { - old.OnNext(v); - old.OnCompleted(); - } - else - { - old.OnCompleted(); - } - } - - public void OnError(Exception error) - { - if (error == null) throw new ArgumentNullException("error"); - - IObserver old; - lock (observerLock) - { - ThrowIfDisposed(); - if (isStopped) return; - - old = outObserver; - outObserver = EmptyObserver.Instance; - isStopped = true; - lastError = error; - } - - old.OnError(error); - } - - public void OnNext(T value) - { - lock (observerLock) - { - ThrowIfDisposed(); - if (isStopped) return; - - this.hasValue = true; - this.lastValue = value; - } - } - - public IDisposable Subscribe(IObserver observer) - { - if (observer == null) throw new ArgumentNullException("observer"); - - var ex = default(Exception); - var v = default(T); - var hv = false; - - lock (observerLock) - { - ThrowIfDisposed(); - if (!isStopped) - { - var listObserver = outObserver as ListObserver; - if (listObserver != null) - { - outObserver = listObserver.Add(observer); - } - else - { - var current = outObserver; - if (current is EmptyObserver) - { - outObserver = observer; - } - else - { - outObserver = new ListObserver(new ImmutableList>(new[] { current, observer })); - } - } - - return new Subscription(this, observer); - } - - ex = lastError; - v = lastValue; - hv = hasValue; - } - - if (ex != null) - { - observer.OnError(ex); - } - else if (hv) - { - observer.OnNext(v); - observer.OnCompleted(); - } - else - { - observer.OnCompleted(); - } - - return EmptyDisposable.Instance; - } - - public void Dispose() - { - lock (observerLock) - { - isDisposed = true; - outObserver = DisposedObserver.Instance; - lastError = null; - lastValue = default(T); - } - } - - void ThrowIfDisposed() - { - if (isDisposed) throw new ObjectDisposedException(""); - } - - class Subscription : IDisposable - { - readonly object gate = new object(); - AsyncSubject parent; - IObserver unsubscribeTarget; - - public Subscription(AsyncSubject parent, IObserver unsubscribeTarget) - { - this.parent = parent; - this.unsubscribeTarget = unsubscribeTarget; - } - - public void Dispose() - { - lock (gate) - { - if (parent != null) - { - lock (parent.observerLock) - { - var listObserver = parent.outObserver as ListObserver; - if (listObserver != null) - { - parent.outObserver = listObserver.Remove(unsubscribeTarget); - } - else - { - parent.outObserver = EmptyObserver.Instance; - } - - unsubscribeTarget = null; - parent = null; - } - } - } - } - } - } - - internal class ListObserver : IObserver - { - private readonly ImmutableList> _observers; - - public ListObserver(ImmutableList> observers) - { - _observers = observers; - } - - public void OnCompleted() - { - var targetObservers = _observers.Data; - for (int i = 0; i < targetObservers.Length; i++) - { - targetObservers[i].OnCompleted(); - } - } - - public void OnError(Exception error) - { - var targetObservers = _observers.Data; - for (int i = 0; i < targetObservers.Length; i++) - { - targetObservers[i].OnError(error); - } - } - - public void OnNext(T value) - { - var targetObservers = _observers.Data; - for (int i = 0; i < targetObservers.Length; i++) - { - targetObservers[i].OnNext(value); - } - } - - internal IObserver Add(IObserver observer) - { - return new ListObserver(_observers.Add(observer)); - } - - internal IObserver Remove(IObserver observer) - { - var i = Array.IndexOf(_observers.Data, observer); - if (i < 0) - return this; - - if (_observers.Data.Length == 2) - { - return _observers.Data[1 - i]; - } - else - { - return new ListObserver(_observers.Remove(observer)); - } - } - } - - internal class EmptyObserver : IObserver - { - public static readonly EmptyObserver Instance = new EmptyObserver(); - - EmptyObserver() - { - - } - - public void OnCompleted() - { - } - - public void OnError(Exception error) - { - } - - public void OnNext(T value) - { - } - } - - internal class ThrowObserver : IObserver - { - public static readonly ThrowObserver Instance = new ThrowObserver(); - - ThrowObserver() - { - - } - - public void OnCompleted() - { - } - - public void OnError(Exception error) - { - ExceptionDispatchInfo.Capture(error).Throw(); - } - - public void OnNext(T value) - { - } - } - - internal class DisposedObserver : IObserver - { - public static readonly DisposedObserver Instance = new DisposedObserver(); - - DisposedObserver() - { - - } - - public void OnCompleted() - { - throw new ObjectDisposedException(""); - } - - public void OnError(Exception error) - { - throw new ObjectDisposedException(""); - } - - public void OnNext(T value) - { - throw new ObjectDisposedException(""); - } - } - - internal class ImmutableList - { - public static readonly ImmutableList Empty = new ImmutableList(); - - T[] data; - - public T[] Data - { - get { return data; } - } - - ImmutableList() - { - data = new T[0]; - } - - public ImmutableList(T[] data) - { - this.data = data; - } - - public ImmutableList Add(T value) - { - var newData = new T[data.Length + 1]; - Array.Copy(data, newData, data.Length); - newData[data.Length] = value; - return new ImmutableList(newData); - } - - public ImmutableList Remove(T value) - { - var i = IndexOf(value); - if (i < 0) return this; - - var length = data.Length; - if (length == 1) return Empty; - - var newData = new T[length - 1]; - - Array.Copy(data, 0, newData, 0, i); - Array.Copy(data, i + 1, newData, i, length - i - 1); - - return new ImmutableList(newData); - } - - public int IndexOf(T value) - { - for (var i = 0; i < data.Length; ++i) - { - // ImmutableList only use for IObserver(no worry for boxed) - if (object.Equals(data[i], value)) return i; - } - return -1; - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/UniTaskObservableExtensions.cs.meta b/VirtueSky/UniTask/Runtime/UniTaskObservableExtensions.cs.meta deleted file mode 100644 index 527a49fc..00000000 --- a/VirtueSky/UniTask/Runtime/UniTaskObservableExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: eaea262a5ad393d419c15b3b2901d664 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTaskScheduler.cs b/VirtueSky/UniTask/Runtime/UniTaskScheduler.cs deleted file mode 100644 index 04f889d5..00000000 --- a/VirtueSky/UniTask/Runtime/UniTaskScheduler.cs +++ /dev/null @@ -1,103 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks -{ - // UniTask has no scheduler like TaskScheduler. - // Only handle unobserved exception. - - public static class UniTaskScheduler - { - public static event Action UnobservedTaskException; - - /// - /// Propagate OperationCanceledException to UnobservedTaskException when true. Default is false. - /// - public static bool PropagateOperationCanceledException = false; - -#if UNITY_2018_3_OR_NEWER - - /// - /// Write log type when catch unobserved exception and not registered UnobservedTaskException. Default is Exception. - /// - public static UnityEngine.LogType UnobservedExceptionWriteLogType = UnityEngine.LogType.Exception; - - /// - /// Dispatch exception event to Unity MainThread. Default is true. - /// - public static bool DispatchUnityMainThread = true; - - // cache delegate. - static readonly SendOrPostCallback handleExceptionInvoke = InvokeUnobservedTaskException; - - static void InvokeUnobservedTaskException(object state) - { - UnobservedTaskException((Exception)state); - } -#endif - - internal static void PublishUnobservedTaskException(Exception ex) - { - if (ex != null) - { - if (!PropagateOperationCanceledException && ex is OperationCanceledException) - { - return; - } - - if (UnobservedTaskException != null) - { -#if UNITY_2018_3_OR_NEWER - if (!DispatchUnityMainThread || Thread.CurrentThread.ManagedThreadId == PlayerLoopHelper.MainThreadId) - { - // allows inlining call. - UnobservedTaskException.Invoke(ex); - } - else - { - // Post to MainThread. - PlayerLoopHelper.UnitySynchronizationContext.Post(handleExceptionInvoke, ex); - } -#else - UnobservedTaskException.Invoke(ex); -#endif - } - else - { -#if UNITY_2018_3_OR_NEWER - string msg = null; - if (UnobservedExceptionWriteLogType != UnityEngine.LogType.Exception) - { - msg = "UnobservedTaskException: " + ex.ToString(); - } - switch (UnobservedExceptionWriteLogType) - { - case UnityEngine.LogType.Error: - UnityEngine.Debug.LogError(msg); - break; - case UnityEngine.LogType.Assert: - UnityEngine.Debug.LogAssertion(msg); - break; - case UnityEngine.LogType.Warning: - UnityEngine.Debug.LogWarning(msg); - break; - case UnityEngine.LogType.Log: - UnityEngine.Debug.Log(msg); - break; - case UnityEngine.LogType.Exception: - UnityEngine.Debug.LogException(ex); - break; - default: - break; - } -#else - Console.WriteLine("UnobservedTaskException: " + ex.ToString()); -#endif - } - } - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/UniTaskScheduler.cs.meta b/VirtueSky/UniTask/Runtime/UniTaskScheduler.cs.meta deleted file mode 100644 index 5e29191f..00000000 --- a/VirtueSky/UniTask/Runtime/UniTaskScheduler.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d6cad69921702d5488d96b5ef30df1b0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTaskSynchronizationContext.cs b/VirtueSky/UniTask/Runtime/UniTaskSynchronizationContext.cs deleted file mode 100644 index 37ca6456..00000000 --- a/VirtueSky/UniTask/Runtime/UniTaskSynchronizationContext.cs +++ /dev/null @@ -1,158 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using System.Threading; - -namespace VirtueSky.Threading.Tasks -{ - public class UniTaskSynchronizationContext : SynchronizationContext - { - const int MaxArrayLength = 0X7FEFFFFF; - const int InitialSize = 16; - - static SpinLock gate = new SpinLock(false); - static bool dequing = false; - - static int actionListCount = 0; - static Callback[] actionList = new Callback[InitialSize]; - - static int waitingListCount = 0; - static Callback[] waitingList = new Callback[InitialSize]; - - static int opCount; - - public override void Send(SendOrPostCallback d, object state) - { - d(state); - } - - public override void Post(SendOrPostCallback d, object state) - { - bool lockTaken = false; - try - { - gate.Enter(ref lockTaken); - - if (dequing) - { - // Ensure Capacity - if (waitingList.Length == waitingListCount) - { - var newLength = waitingListCount * 2; - if ((uint)newLength > MaxArrayLength) newLength = MaxArrayLength; - - var newArray = new Callback[newLength]; - Array.Copy(waitingList, newArray, waitingListCount); - waitingList = newArray; - } - waitingList[waitingListCount] = new Callback(d, state); - waitingListCount++; - } - else - { - // Ensure Capacity - if (actionList.Length == actionListCount) - { - var newLength = actionListCount * 2; - if ((uint)newLength > MaxArrayLength) newLength = MaxArrayLength; - - var newArray = new Callback[newLength]; - Array.Copy(actionList, newArray, actionListCount); - actionList = newArray; - } - actionList[actionListCount] = new Callback(d, state); - actionListCount++; - } - } - finally - { - if (lockTaken) gate.Exit(false); - } - } - - public override void OperationStarted() - { - Interlocked.Increment(ref opCount); - } - - public override void OperationCompleted() - { - Interlocked.Decrement(ref opCount); - } - - public override SynchronizationContext CreateCopy() - { - return this; - } - - // delegate entrypoint. - internal static void Run() - { - { - bool lockTaken = false; - try - { - gate.Enter(ref lockTaken); - if (actionListCount == 0) return; - dequing = true; - } - finally - { - if (lockTaken) gate.Exit(false); - } - } - - for (int i = 0; i < actionListCount; i++) - { - var action = actionList[i]; - actionList[i] = default; - action.Invoke(); - } - - { - bool lockTaken = false; - try - { - gate.Enter(ref lockTaken); - dequing = false; - - var swapTempActionList = actionList; - - actionListCount = waitingListCount; - actionList = waitingList; - - waitingListCount = 0; - waitingList = swapTempActionList; - } - finally - { - if (lockTaken) gate.Exit(false); - } - } - } - - [StructLayout(LayoutKind.Auto)] - readonly struct Callback - { - readonly SendOrPostCallback callback; - readonly object state; - - public Callback(SendOrPostCallback callback, object state) - { - this.callback = callback; - this.state = state; - } - - public void Invoke() - { - try - { - callback(state); - } - catch (Exception ex) - { - UnityEngine.Debug.LogException(ex); - } - } - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/UniTaskSynchronizationContext.cs.meta b/VirtueSky/UniTask/Runtime/UniTaskSynchronizationContext.cs.meta deleted file mode 100644 index 9828c893..00000000 --- a/VirtueSky/UniTask/Runtime/UniTaskSynchronizationContext.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: abf3aae9813db2849bce518f8596e920 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UniTaskVoid.cs b/VirtueSky/UniTask/Runtime/UniTaskVoid.cs deleted file mode 100644 index 88a9088a..00000000 --- a/VirtueSky/UniTask/Runtime/UniTaskVoid.cs +++ /dev/null @@ -1,19 +0,0 @@ -#pragma warning disable CS1591 -#pragma warning disable CS0436 - -using System; -using System.Diagnostics; -using System.Runtime.CompilerServices; -using VirtueSky.Threading.Tasks.CompilerServices; - -namespace VirtueSky.Threading.Tasks -{ - [AsyncMethodBuilder(typeof(AsyncUniTaskVoidMethodBuilder))] - public readonly struct UniTaskVoid - { - public void Forget() - { - } - } -} - diff --git a/VirtueSky/UniTask/Runtime/UniTaskVoid.cs.meta b/VirtueSky/UniTask/Runtime/UniTaskVoid.cs.meta deleted file mode 100644 index 01f7156c..00000000 --- a/VirtueSky/UniTask/Runtime/UniTaskVoid.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e9f28cd922179634d863011548f89ae7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs b/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs deleted file mode 100644 index 92ca702f..00000000 --- a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs +++ /dev/null @@ -1,250 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -#if UNITY_2018_4 || UNITY_2019_4_OR_NEWER -#if UNITASK_ASSETBUNDLE_SUPPORT - -using VirtueSky.Threading.Tasks.Internal; -using System; -using System.Runtime.CompilerServices; -using System.Threading; -using UnityEngine; - -namespace VirtueSky.Threading.Tasks -{ - public static partial class UnityAsyncExtensions - { - public static AssetBundleRequestAllAssetsAwaiter AwaitForAllAssets(this AssetBundleRequest asyncOperation) - { - Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); - return new AssetBundleRequestAllAssetsAwaiter(asyncOperation); - } - - public static UniTask AwaitForAllAssets(this AssetBundleRequest asyncOperation, CancellationToken cancellationToken) - { - return AwaitForAllAssets(asyncOperation, null, PlayerLoopTiming.Update, cancellationToken: cancellationToken); - } - - public static UniTask AwaitForAllAssets(this AssetBundleRequest asyncOperation, CancellationToken cancellationToken, bool cancelImmediately) - { - return AwaitForAllAssets(asyncOperation, progress: null, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately); - } - - public static UniTask AwaitForAllAssets(this AssetBundleRequest asyncOperation, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) - { - Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); - if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken); - if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.allAssets); - return new UniTask(AssetBundleRequestAllAssetsConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, cancelImmediately, out var token), token); - } - - public struct AssetBundleRequestAllAssetsAwaiter : ICriticalNotifyCompletion - { - AssetBundleRequest asyncOperation; - Action continuationAction; - - public AssetBundleRequestAllAssetsAwaiter(AssetBundleRequest asyncOperation) - { - this.asyncOperation = asyncOperation; - this.continuationAction = null; - } - - public AssetBundleRequestAllAssetsAwaiter GetAwaiter() - { - return this; - } - - public bool IsCompleted => asyncOperation.isDone; - - public UnityEngine.Object[] GetResult() - { - if (continuationAction != null) - { - asyncOperation.completed -= continuationAction; - continuationAction = null; - var result = asyncOperation.allAssets; - asyncOperation = null; - return result; - } - else - { - var result = asyncOperation.allAssets; - asyncOperation = null; - return result; - } - } - - public void OnCompleted(Action continuation) - { - UnsafeOnCompleted(continuation); - } - - public void UnsafeOnCompleted(Action continuation) - { - Error.ThrowWhenContinuationIsAlreadyRegistered(continuationAction); - continuationAction = PooledDelegate.Create(continuation); - asyncOperation.completed += continuationAction; - } - } - - sealed class AssetBundleRequestAllAssetsConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode - { - static TaskPool pool; - AssetBundleRequestAllAssetsConfiguredSource nextNode; - public ref AssetBundleRequestAllAssetsConfiguredSource NextNode => ref nextNode; - - static AssetBundleRequestAllAssetsConfiguredSource() - { - TaskPool.RegisterSizeGetter(typeof(AssetBundleRequestAllAssetsConfiguredSource), () => pool.Size); - } - - AssetBundleRequest asyncOperation; - IProgress progress; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - bool completed; - - UniTaskCompletionSourceCore core; - - Action continuationAction; - - AssetBundleRequestAllAssetsConfiguredSource() - { - continuationAction = Continuation; - } - - public static IUniTaskSource Create(AssetBundleRequest asyncOperation, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new AssetBundleRequestAllAssetsConfiguredSource(); - } - - result.asyncOperation = asyncOperation; - result.progress = progress; - result.cancellationToken = cancellationToken; - result.cancelImmediately = cancelImmediately; - result.completed = false; - - asyncOperation.completed += result.continuationAction; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var source = (AssetBundleRequestAllAssetsConfiguredSource)state; - source.core.TrySetCanceled(source.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - token = result.core.Version; - return result; - } - - public UnityEngine.Object[] GetResult(short token) - { - try - { - return core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - // Already completed - if (completed || asyncOperation == null) - { - return false; - } - - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - return false; - } - - if (progress != null) - { - progress.Report(asyncOperation.progress); - } - - if (asyncOperation.isDone) - { - core.TrySetResult(asyncOperation.allAssets); - return false; - } - - return true; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - asyncOperation = default; - progress = default; - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - cancelImmediately = default; - return pool.TryPush(this); - } - - void Continuation(AsyncOperation _) - { - if (completed) - { - return; - } - - completed = true; - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - } - else - { - core.TrySetResult(asyncOperation.allAssets); - } - } - } - } -} - -#endif -#endif \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs.meta b/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs.meta deleted file mode 100644 index 79be9231..00000000 --- a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e9147caba40da434da95b39709c13784 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs b/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs deleted file mode 100644 index 7f3d8117..00000000 --- a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs +++ /dev/null @@ -1,160 +0,0 @@ - #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Threading; -using UnityEngine.Rendering; - -namespace VirtueSky.Threading.Tasks -{ - public static partial class UnityAsyncExtensions - { - #region AsyncGPUReadbackRequest - - public static UniTask.Awaiter GetAwaiter(this AsyncGPUReadbackRequest asyncOperation) - { - return ToUniTask(asyncOperation).GetAwaiter(); - } - - public static UniTask WithCancellation(this AsyncGPUReadbackRequest asyncOperation, CancellationToken cancellationToken) - { - return ToUniTask(asyncOperation, cancellationToken: cancellationToken); - } - - public static UniTask WithCancellation(this AsyncGPUReadbackRequest asyncOperation, CancellationToken cancellationToken, bool cancelImmediately) - { - return ToUniTask(asyncOperation, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately); - } - - public static UniTask ToUniTask(this AsyncGPUReadbackRequest asyncOperation, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) - { - if (asyncOperation.done) return UniTask.FromResult(asyncOperation); - return new UniTask(AsyncGPUReadbackRequestAwaiterConfiguredSource.Create(asyncOperation, timing, cancellationToken, cancelImmediately, out var token), token); - } - - sealed class AsyncGPUReadbackRequestAwaiterConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode - { - static TaskPool pool; - AsyncGPUReadbackRequestAwaiterConfiguredSource nextNode; - public ref AsyncGPUReadbackRequestAwaiterConfiguredSource NextNode => ref nextNode; - - static AsyncGPUReadbackRequestAwaiterConfiguredSource() - { - TaskPool.RegisterSizeGetter(typeof(AsyncGPUReadbackRequestAwaiterConfiguredSource), () => pool.Size); - } - - AsyncGPUReadbackRequest asyncOperation; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - UniTaskCompletionSourceCore core; - - AsyncGPUReadbackRequestAwaiterConfiguredSource() - { - } - - public static IUniTaskSource Create(AsyncGPUReadbackRequest asyncOperation, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new AsyncGPUReadbackRequestAwaiterConfiguredSource(); - } - - result.asyncOperation = asyncOperation; - result.cancellationToken = cancellationToken; - result.cancelImmediately = cancelImmediately; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var promise = (AsyncGPUReadbackRequestAwaiterConfiguredSource)state; - promise.core.TrySetCanceled(promise.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - token = result.core.Version; - return result; - } - - public AsyncGPUReadbackRequest GetResult(short token) - { - try - { - return core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - return false; - } - - if (asyncOperation.hasError) - { - core.TrySetException(new Exception("AsyncGPUReadbackRequest.hasError = true")); - return false; - } - - if (asyncOperation.done) - { - core.TrySetResult(asyncOperation); - return false; - } - - return true; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - asyncOperation = default; - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - cancelImmediately = default; - return pool.TryPush(this); - } - } - - #endregion - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs.meta b/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs.meta deleted file mode 100644 index 510c49e3..00000000 --- a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 98f5fedb44749ab4688674d79126b46a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.Jobs.cs b/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.Jobs.cs deleted file mode 100644 index 1114a006..00000000 --- a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.Jobs.cs +++ /dev/null @@ -1,102 +0,0 @@ -#if ENABLE_MANAGED_JOBS -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Threading; -using Unity.Jobs; -using UnityEngine; - -namespace VirtueSky.Threading.Tasks -{ - public static partial class UnityAsyncExtensions - { - public static async UniTask WaitAsync(this JobHandle jobHandle, PlayerLoopTiming waitTiming, CancellationToken cancellationToken = default) - { - await UniTask.Yield(waitTiming); - jobHandle.Complete(); - cancellationToken.ThrowIfCancellationRequested(); // call cancel after Complete. - } - - public static UniTask.Awaiter GetAwaiter(this JobHandle jobHandle) - { - var handler = JobHandlePromise.Create(jobHandle, out var token); - { - PlayerLoopHelper.AddAction(PlayerLoopTiming.EarlyUpdate, handler); - PlayerLoopHelper.AddAction(PlayerLoopTiming.PreUpdate, handler); - PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, handler); - PlayerLoopHelper.AddAction(PlayerLoopTiming.PreLateUpdate, handler); - PlayerLoopHelper.AddAction(PlayerLoopTiming.PostLateUpdate, handler); - } - - return new UniTask(handler, token).GetAwaiter(); - } - - // can not pass CancellationToken because can't handle JobHandle's Complete and NativeArray.Dispose. - - public static UniTask ToUniTask(this JobHandle jobHandle, PlayerLoopTiming waitTiming) - { - var handler = JobHandlePromise.Create(jobHandle, out var token); - { - PlayerLoopHelper.AddAction(waitTiming, handler); - } - - return new UniTask(handler, token); - } - - sealed class JobHandlePromise : IUniTaskSource, IPlayerLoopItem - { - JobHandle jobHandle; - - UniTaskCompletionSourceCore core; - - // Cancellation is not supported. - public static JobHandlePromise Create(JobHandle jobHandle, out short token) - { - // not use pool. - var result = new JobHandlePromise(); - - result.jobHandle = jobHandle; - - TaskTracker.TrackActiveTask(result, 3); - - token = result.core.Version; - return result; - } - - public void GetResult(short token) - { - TaskTracker.RemoveTracking(this); - core.GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - if (jobHandle.IsCompleted | PlayerLoopHelper.IsEditorApplicationQuitting) - { - jobHandle.Complete(); - core.TrySetResult(AsyncUnit.Default); - return false; - } - - return true; - } - } - } -} - -#endif \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.Jobs.cs.meta b/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.Jobs.cs.meta deleted file mode 100644 index c07df0b8..00000000 --- a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.Jobs.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 30979a768fbd4b94f8694eee8a305c99 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.MonoBehaviour.cs b/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.MonoBehaviour.cs deleted file mode 100644 index 12decb5f..00000000 --- a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.MonoBehaviour.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Threading; - -namespace VirtueSky.Threading.Tasks -{ - public static partial class UnityAsyncExtensions - { - public static UniTask StartAsyncCoroutine(this UnityEngine.MonoBehaviour monoBehaviour, Func asyncCoroutine) - { - var token = monoBehaviour.GetCancellationTokenOnDestroy(); - return asyncCoroutine(token); - } - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.MonoBehaviour.cs.meta b/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.MonoBehaviour.cs.meta deleted file mode 100644 index 6e45863f..00000000 --- a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.MonoBehaviour.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2edd588bb09eb0a4695d039d6a1f02b2 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.cs b/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.cs deleted file mode 100644 index a8890f48..00000000 --- a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.cs +++ /dev/null @@ -1,1196 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Runtime.CompilerServices; -using System.Threading; -using UnityEngine; -using VirtueSky.Threading.Tasks.Internal; -#if ENABLE_UNITYWEBREQUEST && (!UNITY_2019_1_OR_NEWER || UNITASK_WEBREQUEST_SUPPORT) -using UnityEngine.Networking; -#endif - -namespace VirtueSky.Threading.Tasks -{ - public static partial class UnityAsyncExtensions - { - #region AsyncOperation - -#if !UNITY_2023_1_OR_NEWER - // from Unity2023.1.0a15, AsyncOperationAwaitableExtensions.GetAwaiter is defined in UnityEngine. - public static AsyncOperationAwaiter GetAwaiter(this AsyncOperation asyncOperation) - { - Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); - return new AsyncOperationAwaiter(asyncOperation); - } -#endif - - public static UniTask WithCancellation(this AsyncOperation asyncOperation, CancellationToken cancellationToken) - { - return ToUniTask(asyncOperation, cancellationToken: cancellationToken); - } - - public static UniTask WithCancellation(this AsyncOperation asyncOperation, CancellationToken cancellationToken, bool cancelImmediately) - { - return ToUniTask(asyncOperation, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately); - } - - public static UniTask ToUniTask(this AsyncOperation asyncOperation, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) - { - Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); - if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken); - if (asyncOperation.isDone) return UniTask.CompletedTask; - return new UniTask(AsyncOperationConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, cancelImmediately, out var token), token); - } - - public struct AsyncOperationAwaiter : ICriticalNotifyCompletion - { - AsyncOperation asyncOperation; - Action continuationAction; - - public AsyncOperationAwaiter(AsyncOperation asyncOperation) - { - this.asyncOperation = asyncOperation; - this.continuationAction = null; - } - - public bool IsCompleted => asyncOperation.isDone; - - public void GetResult() - { - if (continuationAction != null) - { - asyncOperation.completed -= continuationAction; - continuationAction = null; - asyncOperation = null; - } - else - { - asyncOperation = null; - } - } - - public void OnCompleted(Action continuation) - { - UnsafeOnCompleted(continuation); - } - - public void UnsafeOnCompleted(Action continuation) - { - Error.ThrowWhenContinuationIsAlreadyRegistered(continuationAction); - continuationAction = PooledDelegate.Create(continuation); - asyncOperation.completed += continuationAction; - } - } - - sealed class AsyncOperationConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode - { - static TaskPool pool; - AsyncOperationConfiguredSource nextNode; - public ref AsyncOperationConfiguredSource NextNode => ref nextNode; - - static AsyncOperationConfiguredSource() - { - TaskPool.RegisterSizeGetter(typeof(AsyncOperationConfiguredSource), () => pool.Size); - } - - AsyncOperation asyncOperation; - IProgress progress; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - bool completed; - - UniTaskCompletionSourceCore core; - - Action continuationAction; - - AsyncOperationConfiguredSource() - { - continuationAction = Continuation; - } - - public static IUniTaskSource Create(AsyncOperation asyncOperation, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new AsyncOperationConfiguredSource(); - } - - result.asyncOperation = asyncOperation; - result.progress = progress; - result.cancellationToken = cancellationToken; - result.cancelImmediately = cancelImmediately; - result.completed = false; - - asyncOperation.completed += result.continuationAction; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var source = (AsyncOperationConfiguredSource)state; - source.core.TrySetCanceled(source.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - token = result.core.Version; - return result; - } - - public void GetResult(short token) - { - try - { - core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - // Already completed - if (completed || asyncOperation == null) - { - return false; - } - - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - return false; - } - - if (progress != null) - { - progress.Report(asyncOperation.progress); - } - - if (asyncOperation.isDone) - { - core.TrySetResult(AsyncUnit.Default); - return false; - } - - return true; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - asyncOperation.completed -= continuationAction; - asyncOperation = default; - progress = default; - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - cancelImmediately = default; - return pool.TryPush(this); - } - - void Continuation(AsyncOperation _) - { - if (completed) - { - return; - } - completed = true; - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - } - else - { - core.TrySetResult(AsyncUnit.Default); - } - } - } - - #endregion - - #region ResourceRequest - - public static ResourceRequestAwaiter GetAwaiter(this ResourceRequest asyncOperation) - { - Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); - return new ResourceRequestAwaiter(asyncOperation); - } - - public static UniTask WithCancellation(this ResourceRequest asyncOperation, CancellationToken cancellationToken) - { - return ToUniTask(asyncOperation, cancellationToken: cancellationToken); - } - - public static UniTask WithCancellation(this ResourceRequest asyncOperation, CancellationToken cancellationToken, bool cancelImmediately) - { - return ToUniTask(asyncOperation, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately); - } - - public static UniTask ToUniTask(this ResourceRequest asyncOperation, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) - { - Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); - if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken); - if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.asset); - return new UniTask(ResourceRequestConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, cancelImmediately, out var token), token); - } - - public struct ResourceRequestAwaiter : ICriticalNotifyCompletion - { - ResourceRequest asyncOperation; - Action continuationAction; - - public ResourceRequestAwaiter(ResourceRequest asyncOperation) - { - this.asyncOperation = asyncOperation; - this.continuationAction = null; - } - - public bool IsCompleted => asyncOperation.isDone; - - public UnityEngine.Object GetResult() - { - if (continuationAction != null) - { - asyncOperation.completed -= continuationAction; - continuationAction = null; - var result = asyncOperation.asset; - asyncOperation = null; - return result; - } - else - { - var result = asyncOperation.asset; - asyncOperation = null; - return result; - } - } - - public void OnCompleted(Action continuation) - { - UnsafeOnCompleted(continuation); - } - - public void UnsafeOnCompleted(Action continuation) - { - Error.ThrowWhenContinuationIsAlreadyRegistered(continuationAction); - continuationAction = PooledDelegate.Create(continuation); - asyncOperation.completed += continuationAction; - } - } - - sealed class ResourceRequestConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode - { - static TaskPool pool; - ResourceRequestConfiguredSource nextNode; - public ref ResourceRequestConfiguredSource NextNode => ref nextNode; - - static ResourceRequestConfiguredSource() - { - TaskPool.RegisterSizeGetter(typeof(ResourceRequestConfiguredSource), () => pool.Size); - } - - ResourceRequest asyncOperation; - IProgress progress; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - bool completed; - - UniTaskCompletionSourceCore core; - - Action continuationAction; - - ResourceRequestConfiguredSource() - { - continuationAction = Continuation; - } - - public static IUniTaskSource Create(ResourceRequest asyncOperation, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new ResourceRequestConfiguredSource(); - } - - result.asyncOperation = asyncOperation; - result.progress = progress; - result.cancellationToken = cancellationToken; - result.cancelImmediately = cancelImmediately; - result.completed = false; - - asyncOperation.completed += result.continuationAction; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var source = (ResourceRequestConfiguredSource)state; - source.core.TrySetCanceled(source.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - token = result.core.Version; - return result; - } - - public UnityEngine.Object GetResult(short token) - { - try - { - return core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - // Already completed - if (completed || asyncOperation == null) - { - return false; - } - - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - return false; - } - - if (progress != null) - { - progress.Report(asyncOperation.progress); - } - - if (asyncOperation.isDone) - { - core.TrySetResult(asyncOperation.asset); - return false; - } - - return true; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - asyncOperation.completed -= continuationAction; - asyncOperation = default; - progress = default; - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - cancelImmediately = default; - return pool.TryPush(this); - } - - void Continuation(AsyncOperation _) - { - if (completed) - { - return; - } - completed = true; - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - } - else - { - core.TrySetResult(asyncOperation.asset); - } - } - } - - #endregion - -#if UNITASK_ASSETBUNDLE_SUPPORT - #region AssetBundleRequest - - public static AssetBundleRequestAwaiter GetAwaiter(this AssetBundleRequest asyncOperation) - { - Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); - return new AssetBundleRequestAwaiter(asyncOperation); - } - - public static UniTask WithCancellation(this AssetBundleRequest asyncOperation, CancellationToken cancellationToken) - { - return ToUniTask(asyncOperation, cancellationToken: cancellationToken); - } - - public static UniTask WithCancellation(this AssetBundleRequest asyncOperation, CancellationToken cancellationToken, bool cancelImmediately) - { - return ToUniTask(asyncOperation, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately); - } - - public static UniTask ToUniTask(this AssetBundleRequest asyncOperation, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) - { - Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); - if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken); - if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.asset); - return new UniTask(AssetBundleRequestConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, cancelImmediately, out var token), token); - } - - public struct AssetBundleRequestAwaiter : ICriticalNotifyCompletion - { - AssetBundleRequest asyncOperation; - Action continuationAction; - - public AssetBundleRequestAwaiter(AssetBundleRequest asyncOperation) - { - this.asyncOperation = asyncOperation; - this.continuationAction = null; - } - - public bool IsCompleted => asyncOperation.isDone; - - public UnityEngine.Object GetResult() - { - if (continuationAction != null) - { - asyncOperation.completed -= continuationAction; - continuationAction = null; - var result = asyncOperation.asset; - asyncOperation = null; - return result; - } - else - { - var result = asyncOperation.asset; - asyncOperation = null; - return result; - } - } - - public void OnCompleted(Action continuation) - { - UnsafeOnCompleted(continuation); - } - - public void UnsafeOnCompleted(Action continuation) - { - Error.ThrowWhenContinuationIsAlreadyRegistered(continuationAction); - continuationAction = PooledDelegate.Create(continuation); - asyncOperation.completed += continuationAction; - } - } - - sealed class AssetBundleRequestConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode - { - static TaskPool pool; - AssetBundleRequestConfiguredSource nextNode; - public ref AssetBundleRequestConfiguredSource NextNode => ref nextNode; - - static AssetBundleRequestConfiguredSource() - { - TaskPool.RegisterSizeGetter(typeof(AssetBundleRequestConfiguredSource), () => pool.Size); - } - - AssetBundleRequest asyncOperation; - IProgress progress; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - bool completed; - - UniTaskCompletionSourceCore core; - - Action continuationAction; - - AssetBundleRequestConfiguredSource() - { - continuationAction = Continuation; - } - - public static IUniTaskSource Create(AssetBundleRequest asyncOperation, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new AssetBundleRequestConfiguredSource(); - } - - result.asyncOperation = asyncOperation; - result.progress = progress; - result.cancellationToken = cancellationToken; - result.cancelImmediately = cancelImmediately; - result.completed = false; - - asyncOperation.completed += result.continuationAction; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var source = (AssetBundleRequestConfiguredSource)state; - source.core.TrySetCanceled(source.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - token = result.core.Version; - return result; - } - - public UnityEngine.Object GetResult(short token) - { - try - { - return core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - // Already completed - if (completed || asyncOperation == null) - { - return false; - } - - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - return false; - } - - if (progress != null) - { - progress.Report(asyncOperation.progress); - } - - if (asyncOperation.isDone) - { - core.TrySetResult(asyncOperation.asset); - return false; - } - - return true; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - asyncOperation.completed -= continuationAction; - asyncOperation = default; - progress = default; - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - cancelImmediately = default; - return pool.TryPush(this); - } - - void Continuation(AsyncOperation _) - { - if (completed) - { - return; - } - completed = true; - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - } - else - { - core.TrySetResult(asyncOperation.asset); - } - } - } - - #endregion -#endif - -#if UNITASK_ASSETBUNDLE_SUPPORT - #region AssetBundleCreateRequest - - public static AssetBundleCreateRequestAwaiter GetAwaiter(this AssetBundleCreateRequest asyncOperation) - { - Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); - return new AssetBundleCreateRequestAwaiter(asyncOperation); - } - - public static UniTask WithCancellation(this AssetBundleCreateRequest asyncOperation, CancellationToken cancellationToken) - { - return ToUniTask(asyncOperation, cancellationToken: cancellationToken); - } - - public static UniTask WithCancellation(this AssetBundleCreateRequest asyncOperation, CancellationToken cancellationToken, bool cancelImmediately) - { - return ToUniTask(asyncOperation, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately); - } - - public static UniTask ToUniTask(this AssetBundleCreateRequest asyncOperation, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) - { - Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); - if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken); - if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.assetBundle); - return new UniTask(AssetBundleCreateRequestConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, cancelImmediately, out var token), token); - } - - public struct AssetBundleCreateRequestAwaiter : ICriticalNotifyCompletion - { - AssetBundleCreateRequest asyncOperation; - Action continuationAction; - - public AssetBundleCreateRequestAwaiter(AssetBundleCreateRequest asyncOperation) - { - this.asyncOperation = asyncOperation; - this.continuationAction = null; - } - - public bool IsCompleted => asyncOperation.isDone; - - public AssetBundle GetResult() - { - if (continuationAction != null) - { - asyncOperation.completed -= continuationAction; - continuationAction = null; - var result = asyncOperation.assetBundle; - asyncOperation = null; - return result; - } - else - { - var result = asyncOperation.assetBundle; - asyncOperation = null; - return result; - } - } - - public void OnCompleted(Action continuation) - { - UnsafeOnCompleted(continuation); - } - - public void UnsafeOnCompleted(Action continuation) - { - Error.ThrowWhenContinuationIsAlreadyRegistered(continuationAction); - continuationAction = PooledDelegate.Create(continuation); - asyncOperation.completed += continuationAction; - } - } - - sealed class AssetBundleCreateRequestConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode - { - static TaskPool pool; - AssetBundleCreateRequestConfiguredSource nextNode; - public ref AssetBundleCreateRequestConfiguredSource NextNode => ref nextNode; - - static AssetBundleCreateRequestConfiguredSource() - { - TaskPool.RegisterSizeGetter(typeof(AssetBundleCreateRequestConfiguredSource), () => pool.Size); - } - - AssetBundleCreateRequest asyncOperation; - IProgress progress; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - bool completed; - - UniTaskCompletionSourceCore core; - - Action continuationAction; - - AssetBundleCreateRequestConfiguredSource() - { - continuationAction = Continuation; - } - - public static IUniTaskSource Create(AssetBundleCreateRequest asyncOperation, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new AssetBundleCreateRequestConfiguredSource(); - } - - result.asyncOperation = asyncOperation; - result.progress = progress; - result.cancellationToken = cancellationToken; - result.cancelImmediately = cancelImmediately; - result.completed = false; - - asyncOperation.completed += result.continuationAction; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var source = (AssetBundleCreateRequestConfiguredSource)state; - source.core.TrySetCanceled(source.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - token = result.core.Version; - return result; - } - - public AssetBundle GetResult(short token) - { - try - { - return core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - // Already completed - if (completed || asyncOperation == null) - { - return false; - } - - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - return false; - } - - if (progress != null) - { - progress.Report(asyncOperation.progress); - } - - if (asyncOperation.isDone) - { - core.TrySetResult(asyncOperation.assetBundle); - return false; - } - - return true; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - asyncOperation.completed -= continuationAction; - asyncOperation = default; - progress = default; - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - cancelImmediately = default; - return pool.TryPush(this); - } - - void Continuation(AsyncOperation _) - { - if (completed) - { - return; - } - completed = true; - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - } - else - { - core.TrySetResult(asyncOperation.assetBundle); - } - } - } - - #endregion -#endif - -#if ENABLE_UNITYWEBREQUEST && (!UNITY_2019_1_OR_NEWER || UNITASK_WEBREQUEST_SUPPORT) - #region UnityWebRequestAsyncOperation - - public static UnityWebRequestAsyncOperationAwaiter GetAwaiter(this UnityWebRequestAsyncOperation asyncOperation) - { - Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); - return new UnityWebRequestAsyncOperationAwaiter(asyncOperation); - } - - public static UniTask WithCancellation(this UnityWebRequestAsyncOperation asyncOperation, CancellationToken cancellationToken) - { - return ToUniTask(asyncOperation, cancellationToken: cancellationToken); - } - - public static UniTask WithCancellation(this UnityWebRequestAsyncOperation asyncOperation, CancellationToken cancellationToken, bool cancelImmediately) - { - return ToUniTask(asyncOperation, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately); - } - - public static UniTask ToUniTask(this UnityWebRequestAsyncOperation asyncOperation, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) - { - Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); - if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken); - if (asyncOperation.isDone) - { - if (asyncOperation.webRequest.IsError()) - { - return UniTask.FromException(new UnityWebRequestException(asyncOperation.webRequest)); - } - return UniTask.FromResult(asyncOperation.webRequest); - } - return new UniTask(UnityWebRequestAsyncOperationConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, cancelImmediately, out var token), token); - } - - public struct UnityWebRequestAsyncOperationAwaiter : ICriticalNotifyCompletion - { - UnityWebRequestAsyncOperation asyncOperation; - Action continuationAction; - - public UnityWebRequestAsyncOperationAwaiter(UnityWebRequestAsyncOperation asyncOperation) - { - this.asyncOperation = asyncOperation; - this.continuationAction = null; - } - - public bool IsCompleted => asyncOperation.isDone; - - public UnityWebRequest GetResult() - { - if (continuationAction != null) - { - asyncOperation.completed -= continuationAction; - continuationAction = null; - var result = asyncOperation.webRequest; - asyncOperation = null; - if (result.IsError()) - { - throw new UnityWebRequestException(result); - } - return result; - } - else - { - var result = asyncOperation.webRequest; - asyncOperation = null; - if (result.IsError()) - { - throw new UnityWebRequestException(result); - } - return result; - } - } - - public void OnCompleted(Action continuation) - { - UnsafeOnCompleted(continuation); - } - - public void UnsafeOnCompleted(Action continuation) - { - Error.ThrowWhenContinuationIsAlreadyRegistered(continuationAction); - continuationAction = PooledDelegate.Create(continuation); - asyncOperation.completed += continuationAction; - } - } - - sealed class UnityWebRequestAsyncOperationConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode - { - static TaskPool pool; - UnityWebRequestAsyncOperationConfiguredSource nextNode; - public ref UnityWebRequestAsyncOperationConfiguredSource NextNode => ref nextNode; - - static UnityWebRequestAsyncOperationConfiguredSource() - { - TaskPool.RegisterSizeGetter(typeof(UnityWebRequestAsyncOperationConfiguredSource), () => pool.Size); - } - - UnityWebRequestAsyncOperation asyncOperation; - IProgress progress; - CancellationToken cancellationToken; - CancellationTokenRegistration cancellationTokenRegistration; - bool cancelImmediately; - bool completed; - - UniTaskCompletionSourceCore core; - - Action continuationAction; - - UnityWebRequestAsyncOperationConfiguredSource() - { - continuationAction = Continuation; - } - - public static IUniTaskSource Create(UnityWebRequestAsyncOperation asyncOperation, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, bool cancelImmediately, out short token) - { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - - if (!pool.TryPop(out var result)) - { - result = new UnityWebRequestAsyncOperationConfiguredSource(); - } - - result.asyncOperation = asyncOperation; - result.progress = progress; - result.cancellationToken = cancellationToken; - result.cancelImmediately = cancelImmediately; - result.completed = false; - - asyncOperation.completed += result.continuationAction; - - if (cancelImmediately && cancellationToken.CanBeCanceled) - { - result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => - { - var source = (UnityWebRequestAsyncOperationConfiguredSource)state; - source.asyncOperation.webRequest.Abort(); - source.core.TrySetCanceled(source.cancellationToken); - }, result); - } - - TaskTracker.TrackActiveTask(result, 3); - - PlayerLoopHelper.AddAction(timing, result); - - token = result.core.Version; - return result; - } - - public UnityWebRequest GetResult(short token) - { - try - { - return core.GetResult(token); - } - finally - { - if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) - { - TryReturn(); - } - } - } - - void IUniTaskSource.GetResult(short token) - { - GetResult(token); - } - - public UniTaskStatus GetStatus(short token) - { - return core.GetStatus(token); - } - - public UniTaskStatus UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - public void OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - - public bool MoveNext() - { - // Already completed - if (completed || asyncOperation == null) - { - return false; - } - - if (cancellationToken.IsCancellationRequested) - { - asyncOperation.webRequest.Abort(); - core.TrySetCanceled(cancellationToken); - return false; - } - - if (progress != null) - { - progress.Report(asyncOperation.progress); - } - - if (asyncOperation.isDone) - { - if (asyncOperation.webRequest.IsError()) - { - core.TrySetException(new UnityWebRequestException(asyncOperation.webRequest)); - } - else - { - core.TrySetResult(asyncOperation.webRequest); - } - return false; - } - - return true; - } - - bool TryReturn() - { - TaskTracker.RemoveTracking(this); - core.Reset(); - asyncOperation.completed -= continuationAction; - asyncOperation = default; - progress = default; - cancellationToken = default; - cancellationTokenRegistration.Dispose(); - cancelImmediately = default; - return pool.TryPush(this); - } - - void Continuation(AsyncOperation _) - { - if (completed) - { - return; - } - completed = true; - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - } - else if (asyncOperation.webRequest.IsError()) - { - core.TrySetException(new UnityWebRequestException(asyncOperation.webRequest)); - } - else - { - core.TrySetResult(asyncOperation.webRequest); - } - } - } - - #endregion -#endif - - } -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.cs.meta b/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.cs.meta deleted file mode 100644 index 6dfab815..00000000 --- a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8cc7fd65dd1433e419be4764aeb51391 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.uGUI.cs b/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.uGUI.cs deleted file mode 100644 index bbf9eb53..00000000 --- a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.uGUI.cs +++ /dev/null @@ -1,918 +0,0 @@ -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT -using System; -using System.Threading; -using UnityEngine; -using UnityEngine.Events; -using UnityEngine.UI; - -namespace VirtueSky.Threading.Tasks -{ - public static partial class UnityAsyncExtensions - { - public static AsyncUnityEventHandler GetAsyncEventHandler(this UnityEvent unityEvent, - CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(unityEvent, cancellationToken, false); - } - - public static UniTask OnInvokeAsync(this UnityEvent unityEvent, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(unityEvent, cancellationToken, true).OnInvokeAsync(); - } - - public static IUniTaskAsyncEnumerable OnInvokeAsAsyncEnumerable(this UnityEvent unityEvent, - CancellationToken cancellationToken) - { - return new UnityEventHandlerAsyncEnumerable(unityEvent, cancellationToken); - } - - public static AsyncUnityEventHandler GetAsyncEventHandler(this UnityEvent unityEvent, - CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(unityEvent, cancellationToken, false); - } - - public static UniTask OnInvokeAsync(this UnityEvent unityEvent, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(unityEvent, cancellationToken, true).OnInvokeAsync(); - } - - public static IUniTaskAsyncEnumerable OnInvokeAsAsyncEnumerable(this UnityEvent unityEvent, - CancellationToken cancellationToken) - { - return new UnityEventHandlerAsyncEnumerable(unityEvent, cancellationToken); - } - - public static IAsyncClickEventHandler GetAsyncClickEventHandler(this Button button) - { - return new AsyncUnityEventHandler(button.onClick, button.GetCancellationTokenOnDestroy(), false); - } - - public static IAsyncClickEventHandler GetAsyncClickEventHandler(this Button button, - CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(button.onClick, cancellationToken, false); - } - - public static UniTask OnClickAsync(this Button button) - { - return new AsyncUnityEventHandler(button.onClick, button.GetCancellationTokenOnDestroy(), true) - .OnInvokeAsync(); - } - - public static UniTask OnClickAsync(this Button button, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(button.onClick, cancellationToken, true).OnInvokeAsync(); - } - - public static IUniTaskAsyncEnumerable OnClickAsAsyncEnumerable(this Button button) - { - return new UnityEventHandlerAsyncEnumerable(button.onClick, button.GetCancellationTokenOnDestroy()); - } - - public static IUniTaskAsyncEnumerable OnClickAsAsyncEnumerable(this Button button, - CancellationToken cancellationToken) - { - return new UnityEventHandlerAsyncEnumerable(button.onClick, cancellationToken); - } - - public static IAsyncValueChangedEventHandler GetAsyncValueChangedEventHandler(this Toggle toggle) - { - return new AsyncUnityEventHandler(toggle.onValueChanged, toggle.GetCancellationTokenOnDestroy(), - false); - } - - public static IAsyncValueChangedEventHandler GetAsyncValueChangedEventHandler(this Toggle toggle, - CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(toggle.onValueChanged, cancellationToken, false); - } - - public static UniTask OnValueChangedAsync(this Toggle toggle) - { - return new AsyncUnityEventHandler(toggle.onValueChanged, toggle.GetCancellationTokenOnDestroy(), true) - .OnInvokeAsync(); - } - - public static UniTask OnValueChangedAsync(this Toggle toggle, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(toggle.onValueChanged, cancellationToken, true).OnInvokeAsync(); - } - - public static IUniTaskAsyncEnumerable OnValueChangedAsAsyncEnumerable(this Toggle toggle) - { - return new UnityEventHandlerAsyncEnumerable(toggle.onValueChanged, - toggle.GetCancellationTokenOnDestroy()); - } - - public static IUniTaskAsyncEnumerable OnValueChangedAsAsyncEnumerable(this Toggle toggle, - CancellationToken cancellationToken) - { - return new UnityEventHandlerAsyncEnumerable(toggle.onValueChanged, cancellationToken); - } - - public static IAsyncValueChangedEventHandler GetAsyncValueChangedEventHandler(this Scrollbar scrollbar) - { - return new AsyncUnityEventHandler(scrollbar.onValueChanged, - scrollbar.GetCancellationTokenOnDestroy(), false); - } - - public static IAsyncValueChangedEventHandler GetAsyncValueChangedEventHandler(this Scrollbar scrollbar, - CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(scrollbar.onValueChanged, cancellationToken, false); - } - - public static UniTask OnValueChangedAsync(this Scrollbar scrollbar) - { - return new AsyncUnityEventHandler(scrollbar.onValueChanged, - scrollbar.GetCancellationTokenOnDestroy(), true).OnInvokeAsync(); - } - - public static UniTask OnValueChangedAsync(this Scrollbar scrollbar, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(scrollbar.onValueChanged, cancellationToken, true).OnInvokeAsync(); - } - - public static IUniTaskAsyncEnumerable OnValueChangedAsAsyncEnumerable(this Scrollbar scrollbar) - { - return new UnityEventHandlerAsyncEnumerable(scrollbar.onValueChanged, - scrollbar.GetCancellationTokenOnDestroy()); - } - - public static IUniTaskAsyncEnumerable OnValueChangedAsAsyncEnumerable(this Scrollbar scrollbar, - CancellationToken cancellationToken) - { - return new UnityEventHandlerAsyncEnumerable(scrollbar.onValueChanged, cancellationToken); - } - - public static IAsyncValueChangedEventHandler GetAsyncValueChangedEventHandler( - this ScrollRect scrollRect) - { - return new AsyncUnityEventHandler(scrollRect.onValueChanged, - scrollRect.GetCancellationTokenOnDestroy(), false); - } - - public static IAsyncValueChangedEventHandler GetAsyncValueChangedEventHandler( - this ScrollRect scrollRect, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(scrollRect.onValueChanged, cancellationToken, false); - } - - public static UniTask OnValueChangedAsync(this ScrollRect scrollRect) - { - return new AsyncUnityEventHandler(scrollRect.onValueChanged, - scrollRect.GetCancellationTokenOnDestroy(), true).OnInvokeAsync(); - } - - public static UniTask OnValueChangedAsync(this ScrollRect scrollRect, - CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(scrollRect.onValueChanged, cancellationToken, true) - .OnInvokeAsync(); - } - - public static IUniTaskAsyncEnumerable OnValueChangedAsAsyncEnumerable(this ScrollRect scrollRect) - { - return new UnityEventHandlerAsyncEnumerable(scrollRect.onValueChanged, - scrollRect.GetCancellationTokenOnDestroy()); - } - - public static IUniTaskAsyncEnumerable OnValueChangedAsAsyncEnumerable(this ScrollRect scrollRect, - CancellationToken cancellationToken) - { - return new UnityEventHandlerAsyncEnumerable(scrollRect.onValueChanged, cancellationToken); - } - - public static IAsyncValueChangedEventHandler GetAsyncValueChangedEventHandler(this Slider slider) - { - return new AsyncUnityEventHandler(slider.onValueChanged, slider.GetCancellationTokenOnDestroy(), - false); - } - - public static IAsyncValueChangedEventHandler GetAsyncValueChangedEventHandler(this Slider slider, - CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(slider.onValueChanged, cancellationToken, false); - } - - public static UniTask OnValueChangedAsync(this Slider slider) - { - return new AsyncUnityEventHandler(slider.onValueChanged, slider.GetCancellationTokenOnDestroy(), - true).OnInvokeAsync(); - } - - public static UniTask OnValueChangedAsync(this Slider slider, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(slider.onValueChanged, cancellationToken, true).OnInvokeAsync(); - } - - public static IUniTaskAsyncEnumerable OnValueChangedAsAsyncEnumerable(this Slider slider) - { - return new UnityEventHandlerAsyncEnumerable(slider.onValueChanged, - slider.GetCancellationTokenOnDestroy()); - } - - public static IUniTaskAsyncEnumerable OnValueChangedAsAsyncEnumerable(this Slider slider, - CancellationToken cancellationToken) - { - return new UnityEventHandlerAsyncEnumerable(slider.onValueChanged, cancellationToken); - } - - public static IAsyncEndEditEventHandler GetAsyncEndEditEventHandler(this InputField inputField) - { - return new AsyncUnityEventHandler(inputField.onEndEdit, inputField.GetCancellationTokenOnDestroy(), - false); - } - - public static IAsyncEndEditEventHandler GetAsyncEndEditEventHandler(this InputField inputField, - CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(inputField.onEndEdit, cancellationToken, false); - } - - public static UniTask OnEndEditAsync(this InputField inputField) - { - return new AsyncUnityEventHandler(inputField.onEndEdit, inputField.GetCancellationTokenOnDestroy(), - true).OnInvokeAsync(); - } - - public static UniTask OnEndEditAsync(this InputField inputField, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(inputField.onEndEdit, cancellationToken, true).OnInvokeAsync(); - } - - public static IUniTaskAsyncEnumerable OnEndEditAsAsyncEnumerable(this InputField inputField) - { - return new UnityEventHandlerAsyncEnumerable(inputField.onEndEdit, - inputField.GetCancellationTokenOnDestroy()); - } - - public static IUniTaskAsyncEnumerable OnEndEditAsAsyncEnumerable(this InputField inputField, - CancellationToken cancellationToken) - { - return new UnityEventHandlerAsyncEnumerable(inputField.onEndEdit, cancellationToken); - } - - public static IAsyncValueChangedEventHandler GetAsyncValueChangedEventHandler( - this InputField inputField) - { - return new AsyncUnityEventHandler(inputField.onValueChanged, - inputField.GetCancellationTokenOnDestroy(), false); - } - - public static IAsyncValueChangedEventHandler GetAsyncValueChangedEventHandler( - this InputField inputField, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(inputField.onValueChanged, cancellationToken, false); - } - - public static UniTask OnValueChangedAsync(this InputField inputField) - { - return new AsyncUnityEventHandler(inputField.onValueChanged, - inputField.GetCancellationTokenOnDestroy(), true).OnInvokeAsync(); - } - - public static UniTask OnValueChangedAsync(this InputField inputField, - CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(inputField.onValueChanged, cancellationToken, true) - .OnInvokeAsync(); - } - - public static IUniTaskAsyncEnumerable OnValueChangedAsAsyncEnumerable(this InputField inputField) - { - return new UnityEventHandlerAsyncEnumerable(inputField.onValueChanged, - inputField.GetCancellationTokenOnDestroy()); - } - - public static IUniTaskAsyncEnumerable OnValueChangedAsAsyncEnumerable(this InputField inputField, - CancellationToken cancellationToken) - { - return new UnityEventHandlerAsyncEnumerable(inputField.onValueChanged, cancellationToken); - } - - public static IAsyncValueChangedEventHandler GetAsyncValueChangedEventHandler(this Dropdown dropdown) - { - return new AsyncUnityEventHandler(dropdown.onValueChanged, dropdown.GetCancellationTokenOnDestroy(), - false); - } - - public static IAsyncValueChangedEventHandler GetAsyncValueChangedEventHandler(this Dropdown dropdown, - CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(dropdown.onValueChanged, cancellationToken, false); - } - - public static UniTask OnValueChangedAsync(this Dropdown dropdown) - { - return new AsyncUnityEventHandler(dropdown.onValueChanged, dropdown.GetCancellationTokenOnDestroy(), - true).OnInvokeAsync(); - } - - public static UniTask OnValueChangedAsync(this Dropdown dropdown, CancellationToken cancellationToken) - { - return new AsyncUnityEventHandler(dropdown.onValueChanged, cancellationToken, true).OnInvokeAsync(); - } - - public static IUniTaskAsyncEnumerable OnValueChangedAsAsyncEnumerable(this Dropdown dropdown) - { - return new UnityEventHandlerAsyncEnumerable(dropdown.onValueChanged, - dropdown.GetCancellationTokenOnDestroy()); - } - - public static IUniTaskAsyncEnumerable OnValueChangedAsAsyncEnumerable(this Dropdown dropdown, - CancellationToken cancellationToken) - { - return new UnityEventHandlerAsyncEnumerable(dropdown.onValueChanged, cancellationToken); - } - } - - public interface IAsyncClickEventHandler : IDisposable - { - UniTask OnClickAsync(); - } - - public interface IAsyncValueChangedEventHandler : IDisposable - { - UniTask OnValueChangedAsync(); - } - - public interface IAsyncEndEditEventHandler : IDisposable - { - UniTask OnEndEditAsync(); - } - - // for TMP_PRO - - public interface IAsyncEndTextSelectionEventHandler : IDisposable - { - UniTask OnEndTextSelectionAsync(); - } - - public interface IAsyncTextSelectionEventHandler : IDisposable - { - UniTask OnTextSelectionAsync(); - } - - public interface IAsyncDeselectEventHandler : IDisposable - { - UniTask OnDeselectAsync(); - } - - public interface IAsyncSelectEventHandler : IDisposable - { - UniTask OnSelectAsync(); - } - - public interface IAsyncSubmitEventHandler : IDisposable - { - UniTask OnSubmitAsync(); - } - - internal class TextSelectionEventConverter : UnityEvent<(string, int, int)>, IDisposable - { - readonly UnityEvent innerEvent; - readonly UnityAction invokeDelegate; - - - public TextSelectionEventConverter(UnityEvent unityEvent) - { - this.innerEvent = unityEvent; - this.invokeDelegate = InvokeCore; - - innerEvent.AddListener(invokeDelegate); - } - - void InvokeCore(string item1, int item2, int item3) - { - Invoke((item1, item2, item3)); - } - - public void Dispose() - { - innerEvent.RemoveListener(invokeDelegate); - } - } - - public class AsyncUnityEventHandler : IUniTaskSource, IDisposable, IAsyncClickEventHandler - { - static Action cancellationCallback = CancellationCallback; - - readonly UnityAction action; - readonly UnityEvent unityEvent; - - CancellationToken cancellationToken; - CancellationTokenRegistration registration; - bool isDisposed; - bool callOnce; - - UniTaskCompletionSourceCore core; - - public AsyncUnityEventHandler(UnityEvent unityEvent, CancellationToken cancellationToken, bool callOnce) - { - this.cancellationToken = cancellationToken; - if (cancellationToken.IsCancellationRequested) - { - isDisposed = true; - return; - } - - this.action = Invoke; - this.unityEvent = unityEvent; - this.callOnce = callOnce; - - unityEvent.AddListener(action); - - if (cancellationToken.CanBeCanceled) - { - registration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, this); - } - - TaskTracker.TrackActiveTask(this, 3); - } - - public UniTask OnInvokeAsync() - { - core.Reset(); - if (isDisposed) - { - core.TrySetCanceled(this.cancellationToken); - } - - return new UniTask(this, core.Version); - } - - void Invoke() - { - core.TrySetResult(AsyncUnit.Default); - } - - static void CancellationCallback(object state) - { - var self = (AsyncUnityEventHandler)state; - self.Dispose(); - } - - public void Dispose() - { - if (!isDisposed) - { - isDisposed = true; - TaskTracker.RemoveTracking(this); - registration.Dispose(); - if (unityEvent != null) - { - unityEvent.RemoveListener(action); - } - - core.TrySetCanceled(cancellationToken); - } - } - - UniTask IAsyncClickEventHandler.OnClickAsync() - { - return OnInvokeAsync(); - } - - void IUniTaskSource.GetResult(short token) - { - try - { - core.GetResult(token); - } - finally - { - if (callOnce) - { - Dispose(); - } - } - } - - UniTaskStatus IUniTaskSource.GetStatus(short token) - { - return core.GetStatus(token); - } - - UniTaskStatus IUniTaskSource.UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - - public class AsyncUnityEventHandler : IUniTaskSource, IDisposable, IAsyncValueChangedEventHandler, - IAsyncEndEditEventHandler - , IAsyncEndTextSelectionEventHandler, IAsyncTextSelectionEventHandler, IAsyncDeselectEventHandler, - IAsyncSelectEventHandler, IAsyncSubmitEventHandler - { - static Action cancellationCallback = CancellationCallback; - - readonly UnityAction action; - readonly UnityEvent unityEvent; - - CancellationToken cancellationToken; - CancellationTokenRegistration registration; - bool isDisposed; - bool callOnce; - - UniTaskCompletionSourceCore core; - - public AsyncUnityEventHandler(UnityEvent unityEvent, CancellationToken cancellationToken, bool callOnce) - { - this.cancellationToken = cancellationToken; - if (cancellationToken.IsCancellationRequested) - { - isDisposed = true; - return; - } - - this.action = Invoke; - this.unityEvent = unityEvent; - this.callOnce = callOnce; - - unityEvent.AddListener(action); - - if (cancellationToken.CanBeCanceled) - { - registration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, this); - } - - TaskTracker.TrackActiveTask(this, 3); - } - - public UniTask OnInvokeAsync() - { - core.Reset(); - if (isDisposed) - { - core.TrySetCanceled(this.cancellationToken); - } - - return new UniTask(this, core.Version); - } - - void Invoke(T result) - { - core.TrySetResult(result); - } - - static void CancellationCallback(object state) - { - var self = (AsyncUnityEventHandler)state; - self.Dispose(); - } - - public void Dispose() - { - if (!isDisposed) - { - isDisposed = true; - TaskTracker.RemoveTracking(this); - registration.Dispose(); - if (unityEvent != null) - { - // Dispose inner delegate for TextSelectionEventConverter - if (unityEvent is IDisposable disp) - { - disp.Dispose(); - } - - unityEvent.RemoveListener(action); - } - - core.TrySetCanceled(); - } - } - - UniTask IAsyncValueChangedEventHandler.OnValueChangedAsync() - { - return OnInvokeAsync(); - } - - UniTask IAsyncEndEditEventHandler.OnEndEditAsync() - { - return OnInvokeAsync(); - } - - UniTask IAsyncEndTextSelectionEventHandler.OnEndTextSelectionAsync() - { - return OnInvokeAsync(); - } - - UniTask IAsyncTextSelectionEventHandler.OnTextSelectionAsync() - { - return OnInvokeAsync(); - } - - UniTask IAsyncDeselectEventHandler.OnDeselectAsync() - { - return OnInvokeAsync(); - } - - UniTask IAsyncSelectEventHandler.OnSelectAsync() - { - return OnInvokeAsync(); - } - - UniTask IAsyncSubmitEventHandler.OnSubmitAsync() - { - return OnInvokeAsync(); - } - - T IUniTaskSource.GetResult(short token) - { - try - { - return core.GetResult(token); - } - finally - { - if (callOnce) - { - Dispose(); - } - } - } - - void IUniTaskSource.GetResult(short token) - { - ((IUniTaskSource)this).GetResult(token); - } - - UniTaskStatus IUniTaskSource.GetStatus(short token) - { - return core.GetStatus(token); - } - - UniTaskStatus IUniTaskSource.UnsafeGetStatus() - { - return core.UnsafeGetStatus(); - } - - void IUniTaskSource.OnCompleted(Action continuation, object state, short token) - { - core.OnCompleted(continuation, state, token); - } - } - - public class UnityEventHandlerAsyncEnumerable : IUniTaskAsyncEnumerable - { - readonly UnityEvent unityEvent; - readonly CancellationToken cancellationToken1; - - public UnityEventHandlerAsyncEnumerable(UnityEvent unityEvent, CancellationToken cancellationToken) - { - this.unityEvent = unityEvent; - this.cancellationToken1 = cancellationToken; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - if (this.cancellationToken1 == cancellationToken) - { - return new UnityEventHandlerAsyncEnumerator(unityEvent, this.cancellationToken1, - CancellationToken.None); - } - else - { - return new UnityEventHandlerAsyncEnumerator(unityEvent, this.cancellationToken1, cancellationToken); - } - } - - class UnityEventHandlerAsyncEnumerator : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action cancel1 = OnCanceled1; - static readonly Action cancel2 = OnCanceled2; - - readonly UnityEvent unityEvent; - CancellationToken cancellationToken1; - CancellationToken cancellationToken2; - - UnityAction unityAction; - CancellationTokenRegistration registration1; - CancellationTokenRegistration registration2; - bool isDisposed; - - public UnityEventHandlerAsyncEnumerator(UnityEvent unityEvent, CancellationToken cancellationToken1, - CancellationToken cancellationToken2) - { - this.unityEvent = unityEvent; - this.cancellationToken1 = cancellationToken1; - this.cancellationToken2 = cancellationToken2; - } - - public AsyncUnit Current => default; - - public UniTask MoveNextAsync() - { - cancellationToken1.ThrowIfCancellationRequested(); - cancellationToken2.ThrowIfCancellationRequested(); - completionSource.Reset(); - - if (unityAction == null) - { - unityAction = Invoke; - - TaskTracker.TrackActiveTask(this, 3); - unityEvent.AddListener(unityAction); - if (cancellationToken1.CanBeCanceled) - { - registration1 = cancellationToken1.RegisterWithoutCaptureExecutionContext(cancel1, this); - } - - if (cancellationToken2.CanBeCanceled) - { - registration2 = cancellationToken2.RegisterWithoutCaptureExecutionContext(cancel2, this); - } - } - - return new UniTask(this, completionSource.Version); - } - - void Invoke() - { - completionSource.TrySetResult(true); - } - - static void OnCanceled1(object state) - { - var self = (UnityEventHandlerAsyncEnumerator)state; - try - { - self.completionSource.TrySetCanceled(self.cancellationToken1); - } - finally - { - self.DisposeAsync().Forget(); - } - } - - static void OnCanceled2(object state) - { - var self = (UnityEventHandlerAsyncEnumerator)state; - try - { - self.completionSource.TrySetCanceled(self.cancellationToken2); - } - finally - { - self.DisposeAsync().Forget(); - } - } - - public UniTask DisposeAsync() - { - if (!isDisposed) - { - isDisposed = true; - TaskTracker.RemoveTracking(this); - registration1.Dispose(); - registration2.Dispose(); - unityEvent.RemoveListener(unityAction); - - completionSource.TrySetCanceled(); - } - - return default; - } - } - } - - public class UnityEventHandlerAsyncEnumerable : IUniTaskAsyncEnumerable - { - readonly UnityEvent unityEvent; - readonly CancellationToken cancellationToken1; - - public UnityEventHandlerAsyncEnumerable(UnityEvent unityEvent, CancellationToken cancellationToken) - { - this.unityEvent = unityEvent; - this.cancellationToken1 = cancellationToken; - } - - public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - if (this.cancellationToken1 == cancellationToken) - { - return new UnityEventHandlerAsyncEnumerator(unityEvent, this.cancellationToken1, - CancellationToken.None); - } - else - { - return new UnityEventHandlerAsyncEnumerator(unityEvent, this.cancellationToken1, cancellationToken); - } - } - - class UnityEventHandlerAsyncEnumerator : MoveNextSource, IUniTaskAsyncEnumerator - { - static readonly Action cancel1 = OnCanceled1; - static readonly Action cancel2 = OnCanceled2; - - readonly UnityEvent unityEvent; - CancellationToken cancellationToken1; - CancellationToken cancellationToken2; - - UnityAction unityAction; - CancellationTokenRegistration registration1; - CancellationTokenRegistration registration2; - bool isDisposed; - - public UnityEventHandlerAsyncEnumerator(UnityEvent unityEvent, CancellationToken cancellationToken1, - CancellationToken cancellationToken2) - { - this.unityEvent = unityEvent; - this.cancellationToken1 = cancellationToken1; - this.cancellationToken2 = cancellationToken2; - } - - public T Current { get; private set; } - - public UniTask MoveNextAsync() - { - cancellationToken1.ThrowIfCancellationRequested(); - cancellationToken2.ThrowIfCancellationRequested(); - completionSource.Reset(); - - if (unityAction == null) - { - unityAction = Invoke; - - TaskTracker.TrackActiveTask(this, 3); - unityEvent.AddListener(unityAction); - if (cancellationToken1.CanBeCanceled) - { - registration1 = cancellationToken1.RegisterWithoutCaptureExecutionContext(cancel1, this); - } - - if (cancellationToken2.CanBeCanceled) - { - registration2 = cancellationToken2.RegisterWithoutCaptureExecutionContext(cancel2, this); - } - } - - return new UniTask(this, completionSource.Version); - } - - void Invoke(T value) - { - Current = value; - completionSource.TrySetResult(true); - } - - static void OnCanceled1(object state) - { - var self = (UnityEventHandlerAsyncEnumerator)state; - try - { - self.completionSource.TrySetCanceled(self.cancellationToken1); - } - finally - { - self.DisposeAsync().Forget(); - } - } - - static void OnCanceled2(object state) - { - var self = (UnityEventHandlerAsyncEnumerator)state; - try - { - self.completionSource.TrySetCanceled(self.cancellationToken2); - } - finally - { - self.DisposeAsync().Forget(); - } - } - - public UniTask DisposeAsync() - { - if (!isDisposed) - { - isDisposed = true; - TaskTracker.RemoveTracking(this); - registration1.Dispose(); - registration2.Dispose(); - if (unityEvent is IDisposable disp) - { - disp.Dispose(); - } - - unityEvent.RemoveListener(unityAction); - - completionSource.TrySetCanceled(); - } - - return default; - } - } - } -} - -#endif \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.uGUI.cs.meta b/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.uGUI.cs.meta deleted file mode 100644 index 90c5d515..00000000 --- a/VirtueSky/UniTask/Runtime/UnityAsyncExtensions.uGUI.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6804799fba2376d4099561d176101aff -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UnityAwaitableExtensions.cs b/VirtueSky/UniTask/Runtime/UnityAwaitableExtensions.cs deleted file mode 100644 index e98c596e..00000000 --- a/VirtueSky/UniTask/Runtime/UnityAwaitableExtensions.cs +++ /dev/null @@ -1,17 +0,0 @@ -#if UNITY_2023_1_OR_NEWER -namespace VirtueSky.Threading.Tasks -{ - public static class UnityAwaitableExtensions - { - public static async UniTask AsUniTask(this UnityEngine.Awaitable awaitable) - { - await awaitable; - } - - public static async UniTask AsUniTask(this UnityEngine.Awaitable awaitable) - { - return await awaitable; - } - } -} -#endif diff --git a/VirtueSky/UniTask/Runtime/UnityAwaitableExtensions.cs.meta b/VirtueSky/UniTask/Runtime/UnityAwaitableExtensions.cs.meta deleted file mode 100644 index 08752a42..00000000 --- a/VirtueSky/UniTask/Runtime/UnityAwaitableExtensions.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: c29533c9e4284dee914b71a6579ea274 -timeCreated: 1698895807 \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/UnityBindingExtensions.cs b/VirtueSky/UniTask/Runtime/UnityBindingExtensions.cs deleted file mode 100644 index 3cc93dcc..00000000 --- a/VirtueSky/UniTask/Runtime/UnityBindingExtensions.cs +++ /dev/null @@ -1,245 +0,0 @@ -using System; -using System.Threading; -using UnityEngine; -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT -using UnityEngine.UI; -#endif - -namespace VirtueSky.Threading.Tasks -{ - public static class UnityBindingExtensions - { -#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT - // -> Text - - public static void BindTo(this IUniTaskAsyncEnumerable source, UnityEngine.UI.Text text, bool rebindOnError = true) - { - BindToCore(source, text, text.GetCancellationTokenOnDestroy(), rebindOnError).Forget(); - } - - public static void BindTo(this IUniTaskAsyncEnumerable source, UnityEngine.UI.Text text, CancellationToken cancellationToken, bool rebindOnError = true) - { - BindToCore(source, text, cancellationToken, rebindOnError).Forget(); - } - - static async UniTaskVoid BindToCore(IUniTaskAsyncEnumerable source, UnityEngine.UI.Text text, CancellationToken cancellationToken, bool rebindOnError) - { - var repeat = false; - BIND_AGAIN: - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (true) - { - bool moveNext; - try - { - moveNext = await e.MoveNextAsync(); - repeat = false; - } - catch (Exception ex) - { - if (ex is OperationCanceledException) return; - - if (rebindOnError && !repeat) - { - repeat = true; - goto BIND_AGAIN; - } - else - { - throw; - } - } - - if (!moveNext) return; - - text.text = e.Current; - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - // -> Text - - public static void BindTo(this IUniTaskAsyncEnumerable source, UnityEngine.UI.Text text, bool rebindOnError = true) - { - BindToCore(source, text, text.GetCancellationTokenOnDestroy(), rebindOnError).Forget(); - } - - public static void BindTo(this IUniTaskAsyncEnumerable source, UnityEngine.UI.Text text, CancellationToken cancellationToken, bool rebindOnError = true) - { - BindToCore(source, text, cancellationToken, rebindOnError).Forget(); - } - - public static void BindTo(this AsyncReactiveProperty source, UnityEngine.UI.Text text, bool rebindOnError = true) - { - BindToCore(source, text, text.GetCancellationTokenOnDestroy(), rebindOnError).Forget(); - } - - static async UniTaskVoid BindToCore(IUniTaskAsyncEnumerable source, UnityEngine.UI.Text text, CancellationToken cancellationToken, bool rebindOnError) - { - var repeat = false; - BIND_AGAIN: - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (true) - { - bool moveNext; - try - { - moveNext = await e.MoveNextAsync(); - repeat = false; - } - catch (Exception ex) - { - if (ex is OperationCanceledException) return; - - if (rebindOnError && !repeat) - { - repeat = true; - goto BIND_AGAIN; - } - else - { - throw; - } - } - - if (!moveNext) return; - - text.text = e.Current.ToString(); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - - // -> Selectable - - public static void BindTo(this IUniTaskAsyncEnumerable source, Selectable selectable, bool rebindOnError = true) - { - BindToCore(source, selectable, selectable.GetCancellationTokenOnDestroy(), rebindOnError).Forget(); - } - - public static void BindTo(this IUniTaskAsyncEnumerable source, Selectable selectable, CancellationToken cancellationToken, bool rebindOnError = true) - { - BindToCore(source, selectable, cancellationToken, rebindOnError).Forget(); - } - - static async UniTaskVoid BindToCore(IUniTaskAsyncEnumerable source, Selectable selectable, CancellationToken cancellationToken, bool rebindOnError) - { - var repeat = false; - BIND_AGAIN: - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (true) - { - bool moveNext; - try - { - moveNext = await e.MoveNextAsync(); - repeat = false; - } - catch (Exception ex) - { - if (ex is OperationCanceledException) return; - - if (rebindOnError && !repeat) - { - repeat = true; - goto BIND_AGAIN; - } - else - { - throw; - } - } - - if (!moveNext) return; - - - selectable.interactable = e.Current; - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } -#endif - - // -> Action - - public static void BindTo(this IUniTaskAsyncEnumerable source, TObject monoBehaviour, Action bindAction, bool rebindOnError = true) - where TObject : MonoBehaviour - { - BindToCore(source, monoBehaviour, bindAction, monoBehaviour.GetCancellationTokenOnDestroy(), rebindOnError).Forget(); - } - - public static void BindTo(this IUniTaskAsyncEnumerable source, TObject bindTarget, Action bindAction, CancellationToken cancellationToken, bool rebindOnError = true) - { - BindToCore(source, bindTarget, bindAction, cancellationToken, rebindOnError).Forget(); - } - - static async UniTaskVoid BindToCore(IUniTaskAsyncEnumerable source, TObject bindTarget, Action bindAction, CancellationToken cancellationToken, bool rebindOnError) - { - var repeat = false; - BIND_AGAIN: - var e = source.GetAsyncEnumerator(cancellationToken); - try - { - while (true) - { - bool moveNext; - try - { - moveNext = await e.MoveNextAsync(); - repeat = false; - } - catch (Exception ex) - { - if (ex is OperationCanceledException) return; - - if (rebindOnError && !repeat) - { - repeat = true; - goto BIND_AGAIN; - } - else - { - throw; - } - } - - if (!moveNext) return; - - bindAction(bindTarget, e.Current); - } - } - finally - { - if (e != null) - { - await e.DisposeAsync(); - } - } - } - } -} diff --git a/VirtueSky/UniTask/Runtime/UnityBindingExtensions.cs.meta b/VirtueSky/UniTask/Runtime/UnityBindingExtensions.cs.meta deleted file mode 100644 index 3fae798e..00000000 --- a/VirtueSky/UniTask/Runtime/UnityBindingExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 090b20e3528552b4a8d751f7df525c2b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/UnityWebRequestException.cs b/VirtueSky/UniTask/Runtime/UnityWebRequestException.cs deleted file mode 100644 index 29ed0b91..00000000 --- a/VirtueSky/UniTask/Runtime/UnityWebRequestException.cs +++ /dev/null @@ -1,67 +0,0 @@ -#if ENABLE_UNITYWEBREQUEST && (!UNITY_2019_1_OR_NEWER || UNITASK_WEBREQUEST_SUPPORT) - -using System; -using System.Collections.Generic; -using UnityEngine.Networking; - -namespace VirtueSky.Threading.Tasks -{ - public class UnityWebRequestException : Exception - { - public UnityWebRequest UnityWebRequest { get; } -#if UNITY_2020_2_OR_NEWER - public UnityWebRequest.Result Result { get; } -#else - public bool IsNetworkError { get; } - public bool IsHttpError { get; } -#endif - public string Error { get; } - public string Text { get; } - public long ResponseCode { get; } - public Dictionary ResponseHeaders { get; } - - string msg; - - public UnityWebRequestException(UnityWebRequest unityWebRequest) - { - this.UnityWebRequest = unityWebRequest; -#if UNITY_2020_2_OR_NEWER - this.Result = unityWebRequest.result; -#else - this.IsNetworkError = unityWebRequest.isNetworkError; - this.IsHttpError = unityWebRequest.isHttpError; -#endif - this.Error = unityWebRequest.error; - this.ResponseCode = unityWebRequest.responseCode; - if (UnityWebRequest.downloadHandler != null) - { - if (unityWebRequest.downloadHandler is DownloadHandlerBuffer dhb) - { - this.Text = dhb.text; - } - } - this.ResponseHeaders = unityWebRequest.GetResponseHeaders(); - } - - public override string Message - { - get - { - if (msg == null) - { - if(!string.IsNullOrWhiteSpace(Text)) - { - msg = Error + Environment.NewLine + Text; - } - else - { - msg = Error; - } - } - return msg; - } - } - } -} - -#endif \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/UnityWebRequestException.cs.meta b/VirtueSky/UniTask/Runtime/UnityWebRequestException.cs.meta deleted file mode 100644 index 50c475e8..00000000 --- a/VirtueSky/UniTask/Runtime/UnityWebRequestException.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 013a499e522703a42962a779b4d9850c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/VirtueSky.Sunflower.UniTask.asmdef b/VirtueSky/UniTask/Runtime/VirtueSky.Sunflower.UniTask.asmdef deleted file mode 100644 index 71b948a9..00000000 --- a/VirtueSky/UniTask/Runtime/VirtueSky.Sunflower.UniTask.asmdef +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "VirtueSky.Sunflower.UniTask", - "rootNamespace": "", - "references": [ - "GUID:9e24947de15b9834991c9d8411ea37cf", - "GUID:84651a3751eca9349aac36a66bba901b", - "GUID:6055be8ebefd69e48b49212b09b47b2f" - ], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [], - "versionDefines": [ - { - "name": "com.unity.modules.assetbundle", - "expression": "", - "define": "UNITASK_ASSETBUNDLE_SUPPORT" - }, - { - "name": "com.unity.modules.physics", - "expression": "", - "define": "UNITASK_PHYSICS_SUPPORT" - }, - { - "name": "com.unity.modules.physics2d", - "expression": "", - "define": "UNITASK_PHYSICS2D_SUPPORT" - }, - { - "name": "com.unity.modules.particlesystem", - "expression": "", - "define": "UNITASK_PARTICLESYSTEM_SUPPORT" - }, - { - "name": "com.unity.ugui", - "expression": "", - "define": "UNITASK_UGUI_SUPPORT" - }, - { - "name": "com.unity.modules.unitywebrequest", - "expression": "", - "define": "UNITASK_WEBREQUEST_SUPPORT" - } - ], - "noEngineReferences": false -} \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/VirtueSky.Sunflower.UniTask.asmdef.meta b/VirtueSky/UniTask/Runtime/VirtueSky.Sunflower.UniTask.asmdef.meta deleted file mode 100644 index e497045e..00000000 --- a/VirtueSky/UniTask/Runtime/VirtueSky.Sunflower.UniTask.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: f51ebe6a0ceec4240a699833d6309b23 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VirtueSky/UniTask/Runtime/_InternalVisibleTo.cs b/VirtueSky/UniTask/Runtime/_InternalVisibleTo.cs deleted file mode 100644 index ab7c10c9..00000000 --- a/VirtueSky/UniTask/Runtime/_InternalVisibleTo.cs +++ /dev/null @@ -1,6 +0,0 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("UniTask.Linq")] -[assembly: InternalsVisibleTo("UniTask.Addressables")] -[assembly: InternalsVisibleTo("UniTask.DOTween")] -[assembly: InternalsVisibleTo("UniTask.TextMeshPro")] \ No newline at end of file diff --git a/VirtueSky/UniTask/Runtime/_InternalVisibleTo.cs.meta b/VirtueSky/UniTask/Runtime/_InternalVisibleTo.cs.meta deleted file mode 100644 index 2ec6cd36..00000000 --- a/VirtueSky/UniTask/Runtime/_InternalVisibleTo.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8507e97eb606fad4b99c6edf92e19cb8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From 0f199450ac44876fd17939db763745b87a772fe1 Mon Sep 17 00:00:00 2001 From: Ducnv Date: Thu, 22 Aug 2024 16:43:43 +0700 Subject: [PATCH 7/8] - rename: Sunflower Control Panel to Magic Panel --- VirtueSky/ControlPanel/ControlPanelWindowEditor.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs b/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs index 8afc7943..848f111b 100644 --- a/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs +++ b/VirtueSky/ControlPanel/ControlPanelWindowEditor.cs @@ -12,11 +12,11 @@ public class ControlPanelWindowEditor : EditorWindow private StatePanelControl statePanelControl; private Vector2 scrollButton = Vector2.zero; - [MenuItem("Sunflower/Control Panel &1", false, priority = 1)] + [MenuItem("Sunflower/Magic Panel &1", false, priority = 1)] public static void ShowPanelControlWindow() { ControlPanelWindowEditor window = - GetWindow("Sunflower Control Panel"); + GetWindow("Magic Panel"); if (window == null) { Debug.LogError("Couldn't open the window!"); @@ -47,7 +47,7 @@ private void OnGUI() { GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); - CPUtility.DrawHeader("Sunflower Control Panel", 17); + CPUtility.DrawHeader("Magic Panel", 17); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); GUILayout.Space(10); From 0882398630fa1b5970dc25b394a7c7e2a896368e Mon Sep 17 00:00:00 2001 From: Ducnv Date: Thu, 22 Aug 2024 17:06:13 +0700 Subject: [PATCH 8/8] - update version --- README.md | 4 +- VirtueSky/ControlPanel/CPAboutDrawer.cs | 11 ++ VirtueSky/ControlPanel/ConstantPackage.cs | 2 +- VirtueSky/Utils/Editor/EditorResources.cs | 3 + .../Utils/Editor/Icons/virtuesky_removebg.png | Bin 0 -> 498359 bytes .../Editor/Icons/virtuesky_removebg.png.meta | 140 ++++++++++++++++++ package.json | 2 +- 7 files changed, 158 insertions(+), 4 deletions(-) create mode 100644 VirtueSky/Utils/Editor/Icons/virtuesky_removebg.png create mode 100644 VirtueSky/Utils/Editor/Icons/virtuesky_removebg.png.meta diff --git a/README.md b/README.md index d6f09e55..0489e378 100644 --- a/README.md +++ b/README.md @@ -23,9 +23,9 @@ ### 1: Download the repo and drop it into folder `Assets` ### 2: Add the line below to `Packages/manifest.json` -for version `2.9.6` +for version `2.9.7` ```csharp -"com.virtuesky.sunflower":"https://github.com/VirtueSky/sunflower.git#2.9.6", +"com.virtuesky.sunflower":"https://github.com/VirtueSky/sunflower.git#2.9.7", ``` ## Includes modules diff --git a/VirtueSky/ControlPanel/CPAboutDrawer.cs b/VirtueSky/ControlPanel/CPAboutDrawer.cs index 98b692e1..a106e315 100644 --- a/VirtueSky/ControlPanel/CPAboutDrawer.cs +++ b/VirtueSky/ControlPanel/CPAboutDrawer.cs @@ -1,6 +1,7 @@ using System; using UnityEditor; using UnityEngine; +using VirtueSky.UtilsEditor; namespace VirtueSky.ControlPanel.Editor { @@ -10,6 +11,8 @@ public static void OnDrawAbout(Rect position, Action drawSetting = null) { GUILayout.Space(10); GUILayout.BeginVertical(); + GUILayout.BeginHorizontal(); + GUILayout.BeginVertical(); CPUtility.DrawHeaderIcon(StatePanelControl.About, "About"); GUILayout.Space(10); GUILayout.TextArea("Name: Sunflower", EditorStyles.boldLabel); @@ -30,6 +33,14 @@ public static void OnDrawAbout(Rect position, Action drawSetting = null) Application.OpenURL("https://github.com/VirtueSky/sunflower/wiki"); } + GUILayout.Space(10); + + GUILayout.EndVertical(); + GUILayout.Box(EditorResources.IconVirtueSky, GUIStyle.none, + GUILayout.Width(180), GUILayout.Height(180)); + GUILayout.EndHorizontal(); + + GUILayout.Space(10); CPUtility.DrawLineLastRectY(3, ConstantControlPanel.POSITION_X_START_CONTENT, position.width); GUILayout.EndVertical(); diff --git a/VirtueSky/ControlPanel/ConstantPackage.cs b/VirtueSky/ControlPanel/ConstantPackage.cs index f21a72eb..96306d6e 100644 --- a/VirtueSky/ControlPanel/ConstantPackage.cs +++ b/VirtueSky/ControlPanel/ConstantPackage.cs @@ -2,7 +2,7 @@ { public class ConstantPackage { - public const string VersionSunflower = "2.9.6"; + public const string VersionSunflower = "2.9.7"; public const string PackageNameInAppPurchase = "com.unity.purchasing"; public const string MaxVersionInAppPurchase = "4.12.2"; public const string PackageNameNewtonsoftJson = "com.unity.nuget.newtonsoft-json"; diff --git a/VirtueSky/Utils/Editor/EditorResources.cs b/VirtueSky/Utils/Editor/EditorResources.cs index f3ccb0c7..b1d868fc 100644 --- a/VirtueSky/Utils/Editor/EditorResources.cs +++ b/VirtueSky/Utils/Editor/EditorResources.cs @@ -73,5 +73,8 @@ public static class EditorResources public static Texture2D IconAbout => FileExtension.FindAssetWithPath("icon_about.png", RELATIVE_PATH); + + public static Texture2D IconVirtueSky => + FileExtension.FindAssetWithPath("virtuesky_removebg.png", RELATIVE_PATH); } } \ No newline at end of file diff --git a/VirtueSky/Utils/Editor/Icons/virtuesky_removebg.png b/VirtueSky/Utils/Editor/Icons/virtuesky_removebg.png new file mode 100644 index 0000000000000000000000000000000000000000..6ded6fec9af457d3b5521be673a1a2e8f2b2738b GIT binary patch literal 498359 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¥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

UtfHGeB*m%)e8U;n8HjvIhD8T|NEV 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�e;2I&}zu8Jwa^*7}^Ae6H4YJUx{1z5|bGe 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 literal 0 HcmV?d00001 diff --git a/VirtueSky/Utils/Editor/Icons/virtuesky_removebg.png.meta b/VirtueSky/Utils/Editor/Icons/virtuesky_removebg.png.meta new file mode 100644 index 00000000..d79bb7f8 --- /dev/null +++ b/VirtueSky/Utils/Editor/Icons/virtuesky_removebg.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 7a9683410876c4651adc20351e3e2c8d +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 51 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 50 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/package.json b/package.json index 4794e1ef..92cb0888 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "com.virtuesky.sunflower", "displayName": "Sunflower", "description": "Core ScriptableObject Architecture for building Unity games", - "version": "2.9.6", + "version": "2.9.7", "unity": "2022.3", "category": "virtuesky", "license": "MIT",

Ih+TcBV9HWgU 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°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⁢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%0DdgAbM6`vb>i=e$w*qY6=abFuCzzojSp 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