1+ // ReSharper disable once CheckNamespace
2+
3+ using System ;
4+ using System . Runtime . CompilerServices ;
5+
6+ // ReSharper disable once CheckNamespace
7+ namespace StructLinq
8+ {
9+ public static partial class StructEnumerable
10+ {
11+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
12+ private static T InnerFirstOrDefault < T , TEnumerator > ( ref TEnumerator enumerator )
13+ where TEnumerator : struct , IStructEnumerator < T >
14+ {
15+ if ( enumerator . MoveNext ( ) )
16+ {
17+ var current = enumerator . Current ;
18+ enumerator . Dispose ( ) ;
19+ return current ;
20+ }
21+ enumerator . Dispose ( ) ;
22+ return default ;
23+ }
24+
25+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
26+ private static T InnerFirstOrDefault < T , TEnumerator > ( ref TEnumerator enumerator , Func < T , bool > predicate )
27+ where TEnumerator : struct , IStructEnumerator < T >
28+ {
29+ while ( enumerator . MoveNext ( ) )
30+ {
31+ var current = enumerator . Current ;
32+ if ( predicate ( current ) )
33+ {
34+ enumerator . Dispose ( ) ;
35+ return current ;
36+ }
37+ }
38+ enumerator . Dispose ( ) ;
39+ return default ;
40+ }
41+
42+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
43+ private static T InnerFirstOrDefault < T , TEnumerator , TFunc > ( ref TEnumerator enumerator , ref TFunc predicate )
44+ where TEnumerator : struct , IStructEnumerator < T >
45+ where TFunc : struct , IFunction < T , bool >
46+ {
47+ while ( enumerator . MoveNext ( ) )
48+ {
49+ var current = enumerator . Current ;
50+ if ( predicate . Eval ( current ) )
51+ {
52+ enumerator . Dispose ( ) ;
53+ return current ;
54+ }
55+ }
56+ enumerator . Dispose ( ) ;
57+ return default ;
58+ }
59+
60+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
61+ public static T FirstOrDefault < T , TEnumerable , TEnumerator > ( this TEnumerable enumerable , Func < TEnumerable , IStructEnumerable < T , TEnumerator > > _ )
62+ where TEnumerator : struct , IStructEnumerator < T >
63+ where TEnumerable : IStructEnumerable < T , TEnumerator >
64+ {
65+ var enumerator = enumerable . GetEnumerator ( ) ;
66+ return InnerFirstOrDefault < T , TEnumerator > ( ref enumerator ) ;
67+ }
68+
69+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
70+ public static T FirstOrDefault < T , TEnumerator > ( this IStructEnumerable < T , TEnumerator > enumerable )
71+ where TEnumerator : struct , IStructEnumerator < T >
72+ {
73+ var enumerator = enumerable . GetEnumerator ( ) ;
74+ return InnerFirstOrDefault < T , TEnumerator > ( ref enumerator ) ;
75+ }
76+
77+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
78+ public static T FirstOrDefault < T , TEnumerable , TEnumerator > ( this TEnumerable enumerable , Func < T , bool > predicate , Func < TEnumerable , IStructEnumerable < T , TEnumerator > > _ )
79+ where TEnumerator : struct , IStructEnumerator < T >
80+ where TEnumerable : IStructEnumerable < T , TEnumerator >
81+ {
82+ var enumerator = enumerable . GetEnumerator ( ) ;
83+ return InnerFirstOrDefault ( ref enumerator , predicate ) ;
84+ }
85+
86+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
87+ public static T FirstOrDefault < T , TEnumerator > ( this IStructEnumerable < T , TEnumerator > enumerable , Func < T , bool > predicate )
88+ where TEnumerator : struct , IStructEnumerator < T >
89+ {
90+ var enumerator = enumerable . GetEnumerator ( ) ;
91+ return InnerFirstOrDefault ( ref enumerator , predicate ) ;
92+ }
93+
94+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
95+ public static T FirstOrDefault < T , TEnumerable , TEnumerator , TFunc > ( this TEnumerable enumerable , ref TFunc predicate , Func < TEnumerable , IStructEnumerable < T , TEnumerator > > _ )
96+ where TEnumerator : struct , IStructEnumerator < T >
97+ where TEnumerable : IStructEnumerable < T , TEnumerator >
98+ where TFunc : struct , IFunction < T , bool >
99+ {
100+ var enumerator = enumerable . GetEnumerator ( ) ;
101+ return InnerFirstOrDefault < T , TEnumerator , TFunc > ( ref enumerator , ref predicate ) ;
102+ }
103+ }
104+ }
0 commit comments