|
@@ -1,35 +1,44 @@ |
|
|
using System; |
|
|
using System; |
|
|
|
|
|
using System.Collections.Generic; |
|
|
|
|
|
using System.Linq; |
|
|
using System.Threading; |
|
|
using System.Threading; |
|
|
using System.Threading.Tasks; |
|
|
using System.Threading.Tasks; |
|
|
|
|
|
|
|
|
namespace Discord |
|
|
namespace Discord |
|
|
{ |
|
|
{ |
|
|
internal static class Extensions |
|
|
|
|
|
|
|
|
public enum EditMode : byte |
|
|
{ |
|
|
{ |
|
|
public static async Task Timeout(this Task self, int milliseconds) |
|
|
|
|
|
|
|
|
Set, |
|
|
|
|
|
Add, |
|
|
|
|
|
Remove |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
internal static class Extensions |
|
|
|
|
|
{ |
|
|
|
|
|
public static async Task Timeout(this Task task, int milliseconds) |
|
|
{ |
|
|
{ |
|
|
Task timeoutTask = Task.Delay(milliseconds); |
|
|
Task timeoutTask = Task.Delay(milliseconds); |
|
|
Task finishedTask = await Task.WhenAny(self, timeoutTask).ConfigureAwait(false); |
|
|
|
|
|
|
|
|
Task finishedTask = await Task.WhenAny(task, timeoutTask).ConfigureAwait(false); |
|
|
if (finishedTask == timeoutTask) |
|
|
if (finishedTask == timeoutTask) |
|
|
throw new TimeoutException(); |
|
|
throw new TimeoutException(); |
|
|
else |
|
|
else |
|
|
await self.ConfigureAwait(false); |
|
|
|
|
|
|
|
|
await task.ConfigureAwait(false); |
|
|
} |
|
|
} |
|
|
public static async Task<T> Timeout<T>(this Task<T> self, int milliseconds) |
|
|
|
|
|
|
|
|
public static async Task<T> Timeout<T>(this Task<T> task, int milliseconds) |
|
|
{ |
|
|
{ |
|
|
Task timeoutTask = Task.Delay(milliseconds); |
|
|
Task timeoutTask = Task.Delay(milliseconds); |
|
|
Task finishedTask = await Task.WhenAny(self, timeoutTask).ConfigureAwait(false); |
|
|
|
|
|
|
|
|
Task finishedTask = await Task.WhenAny(task, timeoutTask).ConfigureAwait(false); |
|
|
if (finishedTask == timeoutTask) |
|
|
if (finishedTask == timeoutTask) |
|
|
throw new TimeoutException(); |
|
|
throw new TimeoutException(); |
|
|
else |
|
|
else |
|
|
return await self.ConfigureAwait(false); |
|
|
|
|
|
|
|
|
return await task.ConfigureAwait(false); |
|
|
} |
|
|
} |
|
|
public static async Task Timeout(this Task self, int milliseconds, CancellationTokenSource timeoutToken) |
|
|
|
|
|
|
|
|
public static async Task Timeout(this Task task, int milliseconds, CancellationTokenSource timeoutToken) |
|
|
{ |
|
|
{ |
|
|
try |
|
|
try |
|
|
{ |
|
|
{ |
|
|
timeoutToken.CancelAfter(milliseconds); |
|
|
timeoutToken.CancelAfter(milliseconds); |
|
|
await self.ConfigureAwait(false); |
|
|
|
|
|
|
|
|
await task.ConfigureAwait(false); |
|
|
} |
|
|
} |
|
|
catch (OperationCanceledException) |
|
|
catch (OperationCanceledException) |
|
|
{ |
|
|
{ |
|
@@ -38,12 +47,12 @@ namespace Discord |
|
|
throw; |
|
|
throw; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
public static async Task<T> Timeout<T>(this Task<T> self, int milliseconds, CancellationTokenSource timeoutToken) |
|
|
|
|
|
|
|
|
public static async Task<T> Timeout<T>(this Task<T> task, int milliseconds, CancellationTokenSource timeoutToken) |
|
|
{ |
|
|
{ |
|
|
try |
|
|
try |
|
|
{ |
|
|
{ |
|
|
timeoutToken.CancelAfter(milliseconds); |
|
|
timeoutToken.CancelAfter(milliseconds); |
|
|
return await self.ConfigureAwait(false); |
|
|
|
|
|
|
|
|
return await task.ConfigureAwait(false); |
|
|
} |
|
|
} |
|
|
catch (OperationCanceledException) |
|
|
catch (OperationCanceledException) |
|
|
{ |
|
|
{ |
|
@@ -64,5 +73,20 @@ namespace Discord |
|
|
try { await Task.Delay(-1, token).ConfigureAwait(false); } |
|
|
try { await Task.Delay(-1, token).ConfigureAwait(false); } |
|
|
catch (OperationCanceledException) { } //Expected |
|
|
catch (OperationCanceledException) { } //Expected |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static IEnumerable<T> Modify<T>(this IEnumerable<T> original, IEnumerable<T> modified, EditMode mode) |
|
|
|
|
|
{ |
|
|
|
|
|
if (original == null) return null; |
|
|
|
|
|
switch (mode) |
|
|
|
|
|
{ |
|
|
|
|
|
case EditMode.Set: |
|
|
|
|
|
default: |
|
|
|
|
|
return modified; |
|
|
|
|
|
case EditMode.Add: |
|
|
|
|
|
return original.Concat(modified); |
|
|
|
|
|
case EditMode.Remove: |
|
|
|
|
|
return original.Except(modified); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
} |