1+ using System . Collections ;
2+
3+ namespace Futurum . WebApiEndpoint . Micro . Generator . Core ;
4+
5+ public readonly struct EquatableArray < T > : IEquatable < EquatableArray < T > > , IEnumerable < T >
6+ where T : IEquatable < T >
7+ {
8+ public static readonly EquatableArray < T > Empty = new ( Array . Empty < T > ( ) ) ;
9+
10+ private readonly T [ ] _array ;
11+
12+ public EquatableArray ( T [ ] array )
13+ {
14+ _array = array ;
15+ }
16+
17+ public EquatableArray ( IEnumerable < T > ? array )
18+ {
19+ array ??= Enumerable . Empty < T > ( ) ;
20+ _array = array . ToArray ( ) ;
21+ }
22+
23+ public bool Equals ( EquatableArray < T > array ) =>
24+ AsSpan ( ) . SequenceEqual ( array . AsSpan ( ) ) ;
25+
26+ public override bool Equals ( object obj ) =>
27+ obj is EquatableArray < T > array && Equals ( array ) ;
28+
29+ public override int GetHashCode ( )
30+ {
31+ if ( _array is null )
32+ return 0 ;
33+
34+ HashCode hashCode = default ;
35+
36+ foreach ( var item in _array )
37+ hashCode . Add ( item ) ;
38+
39+ return hashCode . ToHashCode ( ) ;
40+ }
41+
42+ private ReadOnlySpan < T > AsSpan ( ) =>
43+ _array . AsSpan ( ) ;
44+
45+ IEnumerator < T > IEnumerable < T > . GetEnumerator ( )
46+ {
47+ IEnumerable < T > array = _array ?? Array . Empty < T > ( ) ;
48+ return array . GetEnumerator ( ) ;
49+ }
50+
51+ IEnumerator IEnumerable . GetEnumerator ( )
52+ {
53+ IEnumerable < T > array = _array ?? Array . Empty < T > ( ) ;
54+ return array . GetEnumerator ( ) ;
55+ }
56+
57+ public int Count =>
58+ _array ? . Length ?? 0 ;
59+
60+ public static bool operator == ( EquatableArray < T > left , EquatableArray < T > right ) =>
61+ left . Equals ( right ) ;
62+
63+ public static bool operator != ( EquatableArray < T > left , EquatableArray < T > right ) =>
64+ ! left . Equals ( right ) ;
65+ }
0 commit comments