unit uutlLinq; {$mode objfpc}{$H+} {$IFDEF UTL_NESTED_PROCVARS} {$modeswitch nestedprocvars} {$ENDIF} interface {$IFDEF UTL_ENUMERATORS} uses Classes, SysUtils, uutlTypes, uutlInterfaces, uutlComparer, uutlFilter; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlCount( constref aEnumerator: specialize IutlEnumerator): Integer; inline; generic function utlAny( constref aEnumerator: specialize IutlEnumerator): Boolean; inline; generic function utlToArray( constref aEnumerator: specialize IutlEnumerator): specialize TutlArray; inline; generic function utlContains( constref aEnumerator: specialize IutlEnumerator; constref aElement: T): Boolean; inline; overload; generic function utlContains( constref aEnumerator: specialize IutlEnumerator; constref aElement: T; constref aComparer: specialize IutlEqualityComparer): Boolean; inline; overload; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlSkip( constref aEnumerator: specialize IutlEnumerator; const aSkip: Integer): specialize IutlEnumerator; inline; generic function utlTake( constref aEnumerator: specialize IutlEnumerator; const aTake: Integer): specialize IutlEnumerator; inline; generic function utlConcat( constref aEnumerator1, aEnumerator2: specialize IutlEnumerator): specialize IutlEnumerator; inline; overload; generic function utlConcat( constref aEnumerators: specialize TutlArray>): specialize IutlEnumerator; inline; overload; generic function utlReverse( constref aEnumerator: specialize IutlEnumerator): specialize IutlEnumerator; inline; {$IFDEF UTL_ADVANCED_ENUMERATORS} generic function utlSort( constref aEnumerator: specialize IutlEnumerator): specialize IutlEnumerator; inline; overload; generic function utlSort( constref aEnumerator: specialize IutlEnumerator; constref aComparer: specialize IutlComparer): specialize IutlEnumerator; inline; overload; generic function utlWhere( constref aEnumerator: specialize IutlEnumerator; constref aFilter: specialize IutlFilter): specialize IutlEnumerator; inline; overload; generic function utlWhere( constref aEnumerator: specialize IutlEnumerator; constref aFilter: specialize TutlFilterEvent): specialize IutlEnumerator; inline; overload; generic function utlWhere( constref aEnumerator: specialize IutlEnumerator; constref aFilter: specialize TutlFilterEventO): specialize IutlEnumerator; inline; overload; {$IFDEF UTL_NESTED_PROCVARS} generic function utlWhere( constref aEnumerator: specialize IutlEnumerator; constref aFilter: specialize TutlFilterEventN): specialize IutlEnumerator; inline; overload; {$ENDIF} generic function utlDistinct( constref aEnumerator: specialize IutlEnumerator): specialize IutlEnumerator; inline; overload; generic function utlDistinct( constref aEnumerator: specialize IutlEnumerator; constref aComparer: specialize IutlComparer): specialize IutlEnumerator; inline; overload; generic function utlIntersect( constref aEnumerator1: specialize IutlEnumerator; constref aEnumerator2: specialize IutlEnumerator): specialize IutlEnumerator; inline; overload; generic function utlIntersect( constref aEnumerator1: specialize IutlEnumerator; constref aEnumerator2: specialize IutlEnumerator; constref aComparer: specialize IutlComparer): specialize IutlEnumerator; inline; overload; generic function utlUnion( constref aEnumerator1: specialize IutlEnumerator; constref aEnumerator2: specialize IutlEnumerator): specialize IutlEnumerator; inline; overload; generic function utlUnion( constref aEnumerator1: specialize IutlEnumerator; constref aEnumerator2: specialize IutlEnumerator; constref aComparer: specialize IutlComparer): specialize IutlEnumerator; inline; overload; generic function utlWithout( constref aEnumerator1: specialize IutlEnumerator; constref aEnumerator2: specialize IutlEnumerator): specialize IutlEnumerator; inline; overload; generic function utlWithout( constref aEnumerator1: specialize IutlEnumerator; constref aEnumerator2: specialize IutlEnumerator; constref aComparer: specialize IutlComparer): specialize IutlEnumerator; inline; overload; generic function utlSelect( constref aEnumerator: specialize IutlEnumerator; constref aSelector: specialize IutlSelector): specialize IutlEnumerator; inline; overload; generic function utlSelect( constref aEnumerator: specialize IutlEnumerator; constref aSelector: specialize TutlSelectEvent): specialize IutlEnumerator; inline; overload; generic function utlSelect( constref aEnumerator: specialize IutlEnumerator; constref aSelector: specialize TutlSelectEventO): specialize IutlEnumerator; inline; overload; {$IFDEF UTL_NESTED_PROCVARS} generic function utlSelect( constref aEnumerator: specialize IutlEnumerator; constref aSelector: specialize TutlSelectEventN): specialize IutlEnumerator; inline; overload; {$ENDIF} generic function utlSelectMany( constref aEnumerator: specialize IutlEnumerator; constref aSelector: specialize IutlSelector>): specialize IutlEnumerator; inline; overload; generic function utlSelectMany( constref aEnumerator: specialize IutlEnumerator; constref aSelector: specialize TutlSelectEvent>): specialize IutlEnumerator; inline; overload; generic function utlSelectMany( constref aEnumerator: specialize IutlEnumerator; constref aSelector: specialize TutlSelectEventO>): specialize IutlEnumerator; inline; overload; {$IFDEF UTL_NESTED_PROCVARS} generic function utlSelectMany( constref aEnumerator: specialize IutlEnumerator; constref aSelector: specialize TutlSelectEventN>): specialize IutlEnumerator; inline; overload; {$ENDIF} generic function utlZip( constref aEnumerator1: specialize IutlEnumerator; constref aEnumerator2: specialize IutlEnumerator): specialize IutlEnumerator>; {$ENDIF} {$ENDIF} implementation {$IFDEF UTL_ENUMERATORS} uses uutlEnumerator; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //utlLinq/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlCount( constref aEnumerator: specialize IutlEnumerator): Integer; begin result := aEnumerator.Count; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlAny( constref aEnumerator: specialize IutlEnumerator): Boolean; begin result := aEnumerator.Any; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlToArray( constref aEnumerator: specialize IutlEnumerator): specialize TutlArray; begin result := aEnumerator.ToArray; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlContains( constref aEnumerator: specialize IutlEnumerator; constref aElement: T): Boolean; begin result := aEnumerator.Contains(aElement, specialize TutlEqualityComparer.Create); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlContains( constref aEnumerator: specialize IutlEnumerator; constref aElement: T; constref aComparer: specialize IutlEqualityComparer): Boolean; begin result := aEnumerator.Contains(aElement, aComparer); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlSkip( constref aEnumerator: specialize IutlEnumerator; const aSkip: Integer): specialize IutlEnumerator; begin result := aEnumerator.Skip(aSkip); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlTake( constref aEnumerator: specialize IutlEnumerator; const aTake: Integer): specialize IutlEnumerator; begin result := aEnumerator.Take(aTake); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlConcat( constref aEnumerator1, aEnumerator2: specialize IutlEnumerator): specialize IutlEnumerator; type TConcatEnumerator = specialize TutlConcatEnumerator; begin result := TConcatEnumerator.Create(TConcatEnumerator.TEnumerators.Create(aEnumerator1, aEnumerator2)); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlConcat( constref aEnumerators: specialize TutlArray>): specialize IutlEnumerator; type TConcatEnumerator = specialize TutlConcatEnumerator; begin result := TConcatEnumerator.Create(aEnumerators); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlReverse( constref aEnumerator: specialize IutlEnumerator): specialize IutlEnumerator; begin result := aEnumerator.Reverse; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$IFDEF UTL_ADVANCED_ENUMERATORS} generic function utlSort( constref aEnumerator: specialize IutlEnumerator): specialize IutlEnumerator; begin result := aEnumerator.Sort(specialize TutlComparer.Create); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlSort( constref aEnumerator: specialize IutlEnumerator; constref aComparer: specialize IutlComparer): specialize IutlEnumerator; begin result := aEnumerator.Sort(aComparer); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlWhere( constref aEnumerator: specialize IutlEnumerator; constref aFilter: specialize IutlFilter): specialize IutlEnumerator; begin result := aEnumerator.Where(aFilter); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlWhere( constref aEnumerator: specialize IutlEnumerator; constref aFilter: specialize TutlFilterEvent): specialize IutlEnumerator; begin result := aEnumerator.Where(specialize TutlCallbackFilter.Create(aFilter)); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlWhere( constref aEnumerator: specialize IutlEnumerator; constref aFilter: specialize TutlFilterEventO): specialize IutlEnumerator; begin result := aEnumerator.Where(specialize TutlCallbackFilter.Create(aFilter)); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$IFDEF UTL_NESTED_PROCVARS} generic function utlWhere( constref aEnumerator: specialize IutlEnumerator; constref aFilter: specialize TutlFilterEventN): specialize IutlEnumerator; begin result := aEnumerator.Where(specialize TutlCallbackFilter.Create(aFilter)); end; {$ENDIF} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlDistinct( constref aEnumerator: specialize IutlEnumerator): specialize IutlEnumerator; begin result := aEnumerator.Distinct(specialize TutlComparer.Create); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlDistinct( constref aEnumerator: specialize IutlEnumerator; constref aComparer: specialize IutlComparer): specialize IutlEnumerator; begin result := aEnumerator.Distinct(aComparer); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlIntersect( constref aEnumerator1: specialize IutlEnumerator; constref aEnumerator2: specialize IutlEnumerator): specialize IutlEnumerator; begin result := aEnumerator1.Intersect(aEnumerator2, specialize TutlComparer.Create); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlIntersect( constref aEnumerator1: specialize IutlEnumerator; constref aEnumerator2: specialize IutlEnumerator; constref aComparer: specialize IutlComparer): specialize IutlEnumerator; begin result := aEnumerator1.Intersect(aEnumerator2, aComparer); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlUnion( constref aEnumerator1: specialize IutlEnumerator; constref aEnumerator2: specialize IutlEnumerator): specialize IutlEnumerator; begin result := aEnumerator1.Union(aEnumerator2, specialize TutlComparer.Create); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlUnion( constref aEnumerator1: specialize IutlEnumerator; constref aEnumerator2: specialize IutlEnumerator; constref aComparer: specialize IutlComparer): specialize IutlEnumerator; begin result := aEnumerator1.Union(aEnumerator2, aComparer); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlWithout( constref aEnumerator1: specialize IutlEnumerator; constref aEnumerator2: specialize IutlEnumerator): specialize IutlEnumerator; begin result := aEnumerator1.Without(aEnumerator2, specialize TutlComparer.Create); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlWithout( constref aEnumerator1: specialize IutlEnumerator; constref aEnumerator2: specialize IutlEnumerator; constref aComparer: specialize IutlComparer): specialize IutlEnumerator; begin result := aEnumerator1.Without(aEnumerator2, aComparer); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlSelect( constref aEnumerator: specialize IutlEnumerator; constref aSelector: specialize IutlSelector): specialize IutlEnumerator; begin result := specialize TutlSelectEnumerator.Create(aEnumerator, aSelector); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlSelect( constref aEnumerator: specialize IutlEnumerator; constref aSelector: specialize TutlSelectEvent): specialize IutlEnumerator; begin result := specialize TutlSelectEnumerator.Create(aEnumerator, specialize TutlCallbackSelector.Create(aSelector)); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlSelect( constref aEnumerator: specialize IutlEnumerator; constref aSelector: specialize TutlSelectEventO): specialize IutlEnumerator; begin result := specialize TutlSelectEnumerator.Create(aEnumerator, specialize TutlCallbackSelector.Create(aSelector)); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$IFDEF UTL_NESTED_PROCVARS} generic function utlSelect( constref aEnumerator: specialize IutlEnumerator; constref aSelector: specialize TutlSelectEventN): specialize IutlEnumerator; begin result := specialize TutlSelectEnumerator.Create(aEnumerator, specialize TutlCallbackSelector.Create(aSelector)); end; {$ENDIF} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlSelectMany( constref aEnumerator: specialize IutlEnumerator; constref aSelector: specialize IutlSelector>): specialize IutlEnumerator; begin result := specialize TutlSelectManyEnumerator.Create(aEnumerator, aSelector); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlSelectMany( constref aEnumerator: specialize IutlEnumerator; constref aSelector: specialize TutlSelectEvent>): specialize IutlEnumerator; begin result := specialize TutlSelectManyEnumerator.Create(aEnumerator, specialize TutlCallbackSelector>.Create(aSelector)); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlSelectMany( constref aEnumerator: specialize IutlEnumerator; constref aSelector: specialize TutlSelectEventO>): specialize IutlEnumerator; begin result := specialize TutlSelectManyEnumerator.Create(aEnumerator, specialize TutlCallbackSelector>.Create(aSelector)); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$IFDEF UTL_NESTED_PROCVARS} generic function utlSelectMany( constref aEnumerator: specialize IutlEnumerator; constref aSelector: specialize TutlSelectEventN>): specialize IutlEnumerator; begin result := specialize TutlSelectManyEnumerator.Create(aEnumerator, specialize TutlCallbackSelector>.Create(aSelector)); end; {$ENDIF} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generic function utlZip( constref aEnumerator1: specialize IutlEnumerator; constref aEnumerator2: specialize IutlEnumerator): specialize IutlEnumerator>; begin result := specialize TutlZipEnumerator.Create(aEnumerator1, aEnumerator2); end; {$ENDIF} {$ENDIF} end.