diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 8ecdc7bee..4e05f639b 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "9"; public const string Build = "0"; - public const string Revision = "3517"; + public const string Revision = "3520"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index 360d22bee..bcf15dc1f 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%MINOR%=9 -%REVISION%=3517 %COREVERSION%=0 +%REVISION%=3520 +%MINOR%=9 %MAJOR%=3 diff --git a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for IDictionary.html b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for IDictionary.html index dc46d81ee..30d1be592 100644 --- a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for IDictionary.html +++ b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for IDictionary.html @@ -2,7 +2,8 @@ - + +

+ + + + +
         + +
function Each<Key,Source,Res>(Self: sequence of System.Linq.IGrouping<Key,Source>; grOperation: System.Linq.IGrouping<Key,Source> -> Res): Dictionary<Key,Res>; @@ -15,7 +16,19 @@
        
function Get<Key, Value>(Self: IDictionary<Key, Value>; K: Key; V: Value := default(Value)): Value;
         , , ,
function operator-<TKey, TVal>(Self: Dictionary<TKey, TVal>; key: TKey): Dictionary<TKey, TVal>; +
         ,
function operator-<TKey, TVal>(Self: Dictionary<TKey, TVal>; keys: sequence of TKey): Dictionary<TKey, TVal>; +
         , ,
function operator+<TKey, TVal>(Self: Dictionary<TKey, TVal>; dict: Dictionary<TKey, TVal>): Dictionary<TKey, TVal>; +
         . ,
procedure operator+=<TKey, TVal>(Self: Dictionary<TKey, TVal>; update: Dictionary<TKey, TVal>); +
        
procedure operator-=<Key,Value>(Self: IDictionary<Key,Value>; k: Key); -
        
procedure operator-=<Key,Value>(Self: IDictionary<Key,Value>; keys: sequence of Key); +
        
procedure Update<TKey, TVal>(Self: Dictionary<TKey, TVal>; update: Dictionary<TKey, TVal>); +
        
\ No newline at end of file diff --git a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for sequence of T.html b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for sequence of T.html index cc3934010..a98bc1c71 100644 --- a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for sequence of T.html +++ b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for sequence of T.html @@ -6,7 +6,6 @@ - @@ -43,9 +42,7 @@

- -
{function Sum<T>(Self: sequence of T; f: T->BigInteger): BigInteger; -
         , - Lst(1,2,3)
function AdjacentGroup<T>(Self: sequence of T): sequence of array of T; + diff --git a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for string.html b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for string.html index c99bc31c5..98fbbc2eb 100644 --- a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for string.html +++ b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for string.html @@ -21,6 +21,7 @@ + @@ -80,6 +81,8 @@
         + + +
         (, ), + + - - - - - @@ -89,7 +90,7 @@
         - @@ -101,27 +102,21 @@
         PascalABC.NET - + - - - - - + - - +
        
function AdjacentGroup<T>(Self: sequence of T): sequence of array of T;
         ,
function Average(Self: sequence of BigInteger): real;
        
function ToIntegers(Self: string; N: integer): array of integer;
         N
function ToLines(Self: string): array of string; +
        
function ToReal(Self: string): real;
        
function ToReal(Self: string; defaultvalue: real): real; diff --git a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Short functions Lst, HSet, SSet, Dict, KV.html b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Short functions Lst, HSet, SSet, Dict, KV.html index 1092e8953..0e567ab6b 100644 --- a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Short functions Lst, HSet, SSet, Dict, KV.html +++ b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Short functions Lst, HSet, SSet, Dict, KV.html @@ -11,6 +11,7 @@ + @@ -20,8 +21,12 @@
         (, )
function Dict<TKey, TVal>(params pairs: array of (TKey, TVal)): Dictionary<TKey, TVal>;
         (, )
function Dict<TKey, TVal>(pairs: sequence of KeyValuePair<TKey, TVal>): Dictionary<TKey, TVal>; +
         (, ),
function Dict<TKey, TVal>(pairs: sequence of (TKey, TVal)): Dictionary<TKey, TVal>; -
         (, ),
function Dict<TKey, TVal>(keys: sequence of TKey; values: sequence of TVal): Dictionary<TKey, TVal>; +
         (, ),
function DictInt(params pairs: array of (integer, integer)): Dictionary<integer, integer>;
         (, )
function DictStr(params pairs: array of (string, string)): Dictionary<string, string>; @@ -58,6 +63,8 @@
         ,
function LstStr(params a: array of string): List<string>;
         ,
function Pair<TKey, TVal>(key: TKey; value: TVal): KeyValuePair<TKey, TVal>; +
         (, )
function SSet<T>(params a: array of T): SortedSet<T>;
         ,
function SSet<T>(a: sequence of T): SortedSet<T>; diff --git a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for sequence generation.html b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for sequence generation.html index 28e53e74c..307fa7c53 100644 --- a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for sequence generation.html +++ b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for sequence generation.html @@ -14,7 +14,8 @@ - + +

+ + + + + + + +
function Iterate<T>(first: T; next: T->T): sequence of T; @@ -81,5 +82,21 @@
         first, next pred
function SeqWhile<T>(first, second: T; next: (T,T) ->T; pred: T->boolean): sequence of T;
         , first second, next pred
function Zip<T, T1>(a: sequence of T; b: sequence of T1): sequence of (T, T1); +
        
function Zip<T, T1, T2>(a: sequence of T; b: sequence of T1; c: sequence of T2): sequence of (T, T1, T2); +
        
function Zip<T, T1, T2, T3>(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3): sequence of (T, T1, T2, T3); +
        
function Zip<T, T1, T2, T3, T4>(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4): sequence of (T, T1, T2, T3, T4); +
        
function Zip<T, T1, TRes>(a: sequence of T; b: sequence of T1; fun: (T,T1) -> TRes): sequence of TRes; +
         ,
function Zip<T, T1, T2, TRes>(a: sequence of T; b: sequence of T1; c: sequence of T2; fun: (T,T1,T2) -> TRes): sequence of TRes; +
         ,
function Zip<T, T1, T2, T3, TRes>(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; fun: (T,T1,T2,T3) -> TRes): sequence of TRes; +
         ,
function Zip<T, T1, T2, T3, T4, TRes>(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4; fun: (T,T1,T2,T3,T4) -> TRes): sequence of TRes; +
         ,
\ No newline at end of file diff --git a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/System subroutines.html b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/System subroutines.html index 2541d87f3..eb46fe76d 100644 --- a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/System subroutines.html +++ b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/System subroutines.html @@ -27,6 +27,7 @@ + @@ -41,17 +42,17 @@
        
function ChangeFileNameExtension(fileName, newExt: string): string;
         fileName newExt
procedure ChDir(s: string); +
procedure ChDir(dirName: string);
        
function CreateDir(s: string): boolean; +
function CreateDir(dirName: string): boolean;
         . True,
function DeleteFile(fname: string): boolean; +
function DeleteFile(fileName: string): boolean;
         . , False
function DiskFree(diskname: string): int64; +
function DiskFree(diskName: string): int64;
         diskname
function DiskFree(disk: integer): int64;
         disk. disk=0 - , disk=1 - A: , disk=2 - B: ..
function DiskSize(diskname: string): int64; +
function DiskSize(diskName: string): int64;
         diskname
function DiskSize(disk: integer): int64;
         disk. disk=0 - , disk=1 - A: , disk=2 - B: ..
function MillisecondsDelta: integer;
         Milliseconds MillisecondsDelta
procedure MkDir(s: string); +
procedure MkDir(dirName: string);
        
procedure New<T>(var p: ^T);
         sizeof(T) p . T
function PointerToString(p: pointer): string;
        
function RemoveDir(s: string): boolean; +
function RemoveDir(dirName: string): boolean;
         . True,
function RenameDirectory(dirName, newDirName: string): boolean; +
         dirName, newDirName. True,
function RenameFile(fileName, newfileName: string): boolean;
         fileName, newfileName. True,
procedure RmDir(s: string); +
procedure RmDir(dirName: string);
        
function SetCurrentDir(s: string): boolean; +
function SetCurrentDir(dirName: string): boolean;
         . True,
procedure Sleep(ms: integer);
         ms
function TypeName(o: object): string; -
        
procedure TypeName(o: object; res: StringBuilder); -
         res
procedure TypeName(o: object; res: TextWriter); -
         res
function TypeName(obj: object): string; +
        
function TypeToTypeName(t: System.Type): string; -
         System.Type
procedure TypeToTypeName(t: System.Type; res: StringBuilder); -
         System.Type res
procedure TypeToTypeName(t: System.Type; res: TextWriter); -
         System.Type res
\ No newline at end of file diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt index 2830ef0b1..5d669df3d 100644 --- a/Release/pabcversion.txt +++ b/Release/pabcversion.txt @@ -1 +1 @@ -3.9.0.3517 +3.9.0.3520 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 312e336d6..8865837f5 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.9.0.3517' +!define VERSION '3.9.0.3520' diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index ced27eaae..90d272595 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -2278,6 +2278,40 @@ function SeqWhile(first, second: T; next: (T,T) ->T; pred: T->boolean): seque function SeqFill(count: integer; x: T): sequence of T; /// Возвращает бесконечную рекуррентную последовательность элементов, задаваемую начальным элементом first и функцией next function Iterate(first: T; next: T->T): sequence of T; +/// Объединяет две последовательности в последовательность двухэлементных кортежей +function Zip(a: sequence of T; b: sequence of T1): sequence of (T, T1); +/// Объединяет три последовательности в последовательность трехэлементных кортежей +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2): sequence of (T, T1, T2); +/// Объединяет четыре последовательности в последовательность четырехэлементных кортежей +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3): sequence of (T, T1, T2, T3); +/// Объединяет пять последовательностей в последовательность пятиэлементных кортежей +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4): sequence of (T, T1, T2, T3, T4); +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(a: sequence of T; b: sequence of T1; fun: (T,T1) -> TRes): sequence of TRes; +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; fun: (T,T1,T2) -> TRes): sequence of TRes; +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; fun: (T,T1,T2,T3) -> TRes): sequence of TRes; +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4; fun: (T,T1,T2,T3,T4) -> TRes): sequence of TRes; + +/// Возвращает декартово произведение последовательностей, проектируя каждую пару на значение +function Cartesian(a: sequence of T; b: sequence of T1; func: (T,T1)->TRes): sequence of TRes; +/// Возвращает декартово произведение последовательностей, проектируя каждую тройку на значение +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; func: (T,T1,T2)->TRes): sequence of TRes; +/// Возвращает декартово произведение последовательностей, проектируя каждую четвёрку на значение +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; func: (T,T1,T2,T3)->TRes): sequence of TRes; +/// Возвращает декартово произведение последовательностей, проектируя каждую пятёрку на значение +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4; func: (T,T1,T2,T3,T4)->TRes): sequence of TRes; +/// Возвращает декартово произведение последовательностей в виде последовательности пар +function Cartesian(a: sequence of T; b: sequence of T1): sequence of (T, T1); +/// Возвращает декартово произведение последовательностей в виде последовательности троек +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2): sequence of (T, T1, T2); +/// Возвращает декартово произведение последовательностей в виде последовательности четвёрок +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3): sequence of (T, T1, T2, T3); +/// Возвращает декартово произведение последовательностей в виде последовательности пятёрок +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4): sequence of (T, T1, T2, T3, T4); + /// Возвращает последовательность из n целых, введенных с клавиатуры function ReadSeqInteger(n: integer): sequence of integer; @@ -5372,6 +5406,119 @@ begin end; end; +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(a: sequence of T; b: sequence of T1; fun: (T,T1) -> TRes): sequence of TRes; +begin + var aen := a.GetEnumerator; + var ben := b.GetEnumerator; + while aen.MoveNext and ben.MoveNext do + yield fun(aen.Current,ben.Current) +end; + +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; fun: (T,T1,T2) -> TRes): sequence of TRes; +begin + var aen := a.GetEnumerator; + var ben := b.GetEnumerator; + var cen := c.GetEnumerator; + while aen.MoveNext and ben.MoveNext and cen.MoveNext do + yield fun(aen.Current,ben.Current,cen.Current) +end; + +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; fun: (T,T1,T2,T3) -> TRes): sequence of TRes; +begin + var aen := a.GetEnumerator; + var ben := b.GetEnumerator; + var cen := c.GetEnumerator; + var den := d.GetEnumerator; + while aen.MoveNext and ben.MoveNext and cen.MoveNext and den.MoveNext do + yield fun(aen.Current,ben.Current,cen.Current,den.Current) +end; + +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4; fun: (T,T1,T2,T3,T4) -> TRes): sequence of TRes; +begin + var aen := a.GetEnumerator; + var ben := b.GetEnumerator; + var cen := c.GetEnumerator; + var den := d.GetEnumerator; + var een := e.GetEnumerator; + while aen.MoveNext and ben.MoveNext and cen.MoveNext and den.MoveNext and een.MoveNext do + yield fun(aen.Current,ben.Current,cen.Current,den.Current,een.Current) +end; + +/// Объединяет две последовательности в последовательность двухэлементных кортежей +function Zip(a: sequence of T; b: sequence of T1): sequence of (T, T1) + := Zip(a,b,(ax,bx) -> (ax,bx)); + +/// Объединяет три последовательности в последовательность трехэлементных кортежей +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2): sequence of (T, T1, T2) + := Zip(a,b,c,(ax,bx,cx) -> (ax,bx,cx)); + +/// Объединяет четыре последовательности в последовательность четырехэлементных кортежей +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3): sequence of (T, T1, T2, T3) + := Zip(a,b,c,d,(ax,bx,cx,dx) -> (ax,bx,cx,dx)); + +/// Объединяет пять последовательностей в последовательность пятиэлементных кортежей +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4): sequence of (T, T1, T2, T3, T4) + := Zip(a,b,c,d,e,(ax,bx,cx,dx,ex) -> (ax,bx,cx,dx,ex)); + +/// Возвращает декартово произведение последовательностей, проектируя каждую пару на значение +function Cartesian(a: sequence of T; b: sequence of T1; func: (T,T1)->TRes): sequence of TRes; +begin + foreach var xa in a do + foreach var xb in b do + yield func(xa, xb) +end; + +/// Возвращает декартово произведение последовательностей, проектируя каждую тройку на значение +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; func: (T,T1,T2)->TRes): sequence of TRes; +begin + foreach var xa in a do + foreach var xb in b do + foreach var xc in c do + yield func(xa, xb, xc) +end; + +/// Возвращает декартово произведение последовательностей, проектируя каждую четвёрку на значение +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; func: (T,T1,T2,T3)->TRes): sequence of TRes; +begin + foreach var xa in a do + foreach var xb in b do + foreach var xc in c do + foreach var xd in d do + yield func(xa, xb, xc, xd) +end; + +/// Возвращает декартово произведение последовательностей, проектируя каждую пятёрку на значение +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4; func: (T,T1,T2,T3,T4)->TRes): sequence of TRes; +begin + foreach var xa in a do + foreach var xb in b do + foreach var xc in c do + foreach var xd in d do + foreach var xe in e do + yield func(xa, xb, xc, xd, xe) +end; + +/// Возвращает декартово произведение последовательностей в виде последовательности пар +function Cartesian(a: sequence of T; b: sequence of T1): sequence of (T, T1) + := Cartesian(a,b,(xa,xb) -> (xa,xb)); + +/// Возвращает декартово произведение последовательностей в виде последовательности троек +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2): sequence of (T, T1, T2) + := Cartesian(a,b,c,(xa,xb,xc) -> (xa,xb,xc)); + +/// Возвращает декартово произведение последовательностей в виде последовательности четвёрок +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3): sequence of (T, T1, T2, T3) + := Cartesian(a,b,c,d,(xa,xb,xc,xd) -> (xa,xb,xc,xd)); + +/// Возвращает декартово произведение последовательностей в виде последовательности пятёрок +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4): sequence of (T, T1, T2, T3, T4) + := Cartesian(a,b,c,d,e,(xa,xb,xc,xd,xe) -> (xa,xb,xc,xd,xe)); + + function SeqGen(count: integer; first: T; next: T->T): sequence of T; begin if count < 1 then @@ -10700,7 +10847,7 @@ begin end; end; -/// Возвращает сумму элементов последовательности, спроектированных на числовое значение - пока не работает для Lst(1,2,3) +// Возвращает сумму элементов последовательности, спроектированных на числовое значение - пока не работает для Lst(1,2,3) {function Sum(Self: sequence of T; f: T->BigInteger): BigInteger; extensionmethod; begin Result := 0; @@ -10797,6 +10944,7 @@ end; // Дополнения февраль 2016: MinBy, MaxBy, TakeLast, Slice, Cartesian, SplitAt, // Partition, ZipTuple, UnZipTuple, Interleave, Numerate, Tabulate, Pairwise, Batch +// Дополнения 2024: Zip - синоним ZipTuple /// Возвращает первый элемент последовательности с минимальным значением ключа function MinBy(Self: sequence of T; selector: T->TKey): T; extensionmethod; @@ -10912,28 +11060,6 @@ begin Result := Self.Reverse.Skip(count).Reverse; end; -/// Возвращает декартово произведение последовательностей в виде последовательности пар -function Cartesian(Self: sequence of T; b: sequence of T1): sequence of (T, T1); extensionmethod; -begin - if b = nil then - raise new System.ArgumentNullException('b'); - - foreach var x in Self do - foreach var y in b do - yield (x, y) -end; - -/// Возвращает декартово произведение последовательностей, проектируя каждую пару на значение -function Cartesian(Self: sequence of T; b: sequence of T1; func: (T,T1)->T2): sequence of T2; extensionmethod; -begin - if b = nil then - raise new System.ArgumentNullException('b'); - - foreach var x in Self do - foreach var y in b do - yield func(x, y) -end; - /// Разбивает последовательность на две в позиции ind. Реализуется двухпроходным алгоритмом function SplitAt(Self: sequence of T; ind: integer): (sequence of T, sequence of T); extensionmethod; begin @@ -10956,65 +11082,86 @@ begin Result := (Self.Where(cond), Self.Where((x, i) -> not cond(x, i))); end; -/// Объединяет две последовательности в последовательность двухэлементных кортежей -function ZipTuple(Self: sequence of T; a: sequence of T1): sequence of (T, T1); extensionmethod; -begin - if a = nil then - raise new System.ArgumentNullException('a'); - Result := Self.Zip(a, (x, y) -> (x, y)); -end; -/// Объединяет три последовательности в последовательность трехэлементных кортежей -function ZipTuple(Self: sequence of T; a: sequence of T1; b: sequence of T2): sequence of (T, T1, T2); extensionmethod; -begin - if a = nil then - raise new System.ArgumentNullException('a'); - if b = nil then - raise new System.ArgumentNullException('b'); - Result := Self.Zip(a, (x, y) -> (x, y)).Zip(b, (p, z) -> (p[0], p[1], z)); -end; +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(Self: sequence of T; b: sequence of T1; c: sequence of T2; func: (T,T1,T2) -> TRes): sequence of TRes; extensionmethod + := Zip(Self,b,c,func); + +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(Self: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; func: (T,T1,T2,T3) -> TRes): sequence of TRes; extensionmethod + := Zip(Self,b,c,d,func); + +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(Self: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4; func: (T,T1,T2,T3,T4) -> TRes): sequence of TRes; extensionmethod + := Zip(Self,b,c,d,e,func); -/// Объединяет четыре последовательности в последовательность четырехэлементных кортежей -function ZipTuple(Self: sequence of T; a: sequence of T1; b: sequence of T2; c: sequence of T3): sequence of (T, T1, T2, T3); extensionmethod; -begin - if a = nil then - raise new System.ArgumentNullException('a'); - if b = nil then - raise new System.ArgumentNullException('b'); - if c = nil then - raise new System.ArgumentNullException('c'); - Result := Self.Zip(a, (x, y)-> (x, y)).Zip(b, (p, z) -> (p[0], p[1], z)).Zip(c, (p, z) -> (p[0], p[1], p[2], z)); -end; /// Объединяет две последовательности в последовательность двухэлементных кортежей -function Zip(Self: sequence of T; a: sequence of T1): sequence of (T, T1); extensionmethod; -begin - if a = nil then - raise new System.ArgumentNullException('a'); - Result := Self.Zip(a, (x, y) -> (x, y)); -end; +function Zip(Self: sequence of T; b: sequence of T1): sequence of (T, T1); extensionmethod + := Zip(Self,b); /// Объединяет три последовательности в последовательность трехэлементных кортежей -function Zip(Self: sequence of T; a: sequence of T1; b: sequence of T2): sequence of (T, T1, T2); extensionmethod; -begin - if a = nil then - raise new System.ArgumentNullException('a'); - if b = nil then - raise new System.ArgumentNullException('b'); - Result := Self.Zip(a, (x, y) -> (x, y)).Zip(b, (p, z) -> (p[0], p[1], z)); -end; +function Zip(Self: sequence of T; b: sequence of T1; c: sequence of T2): sequence of (T, T1, T2); extensionmethod + := Zip(Self,b,c); /// Объединяет четыре последовательности в последовательность четырехэлементных кортежей -function Zip(Self: sequence of T; a: sequence of T1; b: sequence of T2; c: sequence of T3): sequence of (T, T1, T2, T3); extensionmethod; -begin - if a = nil then - raise new System.ArgumentNullException('a'); - if b = nil then - raise new System.ArgumentNullException('b'); - if c = nil then - raise new System.ArgumentNullException('c'); - Result := Self.Zip(a, (x, y) -> (x, y)).Zip(b, (p, z) -> (p[0], p[1], z)).Zip(c, (p, z) -> (p[0], p[1], p[2], z)); -end; +function Zip(Self: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3): sequence of (T, T1, T2, T3); extensionmethod + := Zip(Self,b,c,d); + +/// Объединяет четыре последовательности в последовательность четырехэлементных кортежей +function Zip(Self: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4): sequence of (T, T1, T2, T3, T4); extensionmethod + := Zip(Self,b,c,d,e); + + +/// Возвращает декартово произведение последовательностей, проектируя каждую пару на значение +function Cartesian(Self: sequence of T; b: sequence of T1; func: (T,T1)->TRes): sequence of TRes; extensionmethod + := Cartesian(Self,b,func); + +/// Возвращает декартово произведение последовательностей, проектируя каждую тройку на значение +function Cartesian(Self: sequence of T; b: sequence of T1; c: sequence of T2; func: (T,T1,T2)->TRes): sequence of TRes; extensionmethod + := Cartesian(Self,b,c,func); + +/// Возвращает декартово произведение последовательностей, проектируя каждую четвёрку на значение +function Cartesian(Self: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; func: (T,T1,T2,T3)->TRes): sequence of TRes; extensionmethod + := Cartesian(Self,b,c,d,func); + +/// Возвращает декартово произведение последовательностей, проектируя каждую пятёрку на значение +function Cartesian(Self: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4; func: (T,T1,T2,T3,T4)->TRes): sequence of TRes; extensionmethod + := Cartesian(Self,b,c,d,e,func); + + +/// Возвращает декартово произведение последовательностей в виде последовательности пар +function Cartesian(Self: sequence of T; b: sequence of T1): sequence of (T, T1); extensionmethod + := Cartesian(Self,b); + +/// Возвращает декартово произведение последовательностей в виде последовательности троек +function Cartesian(Self: sequence of T; b: sequence of T1; c: sequence of T2): sequence of (T, T1, T2); extensionmethod + := Cartesian(Self,b,c); + +/// Возвращает декартово произведение последовательностей в виде последовательности четвёрок +function Cartesian(Self: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3): sequence of (T, T1, T2, T3); extensionmethod + := Cartesian(Self,b,c,d); + +/// Возвращает декартово произведение последовательностей в виде последовательности пятёрок +function Cartesian(Self: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4): sequence of (T, T1, T2, T3, T4); extensionmethod + := Cartesian(Self,b,c,d,e); + + + + + +/// Объединяет две последовательности в последовательность двухэлементных кортежей +function ZipTuple(Self: sequence of T; a: sequence of T1): sequence of (T, T1); extensionmethod + := Self.Zip(a); + +/// Объединяет три последовательности в последовательность трехэлементных кортежей +function ZipTuple(Self: sequence of T; a: sequence of T1; b: sequence of T2): sequence of (T, T1, T2); extensionmethod + := Self.Zip(a,b); + +/// Объединяет четыре последовательности в последовательность четырехэлементных кортежей +function ZipTuple(Self: sequence of T; a: sequence of T1; b: sequence of T2; c: sequence of T3): sequence of (T, T1, T2, T3); extensionmethod + := Self.Zip(a,b,c); + /// Разъединяет последовательность двухэлементных кортежей на две последовательности. Реализуется двухпроходным алгоритмом function UnZipTuple(Self: sequence of (T, T1)): (sequence of T, sequence of T1); extensionmethod; diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index ced27eaae..90d272595 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -2278,6 +2278,40 @@ function SeqWhile(first, second: T; next: (T,T) ->T; pred: T->boolean): seque function SeqFill(count: integer; x: T): sequence of T; /// Возвращает бесконечную рекуррентную последовательность элементов, задаваемую начальным элементом first и функцией next function Iterate(first: T; next: T->T): sequence of T; +/// Объединяет две последовательности в последовательность двухэлементных кортежей +function Zip(a: sequence of T; b: sequence of T1): sequence of (T, T1); +/// Объединяет три последовательности в последовательность трехэлементных кортежей +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2): sequence of (T, T1, T2); +/// Объединяет четыре последовательности в последовательность четырехэлементных кортежей +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3): sequence of (T, T1, T2, T3); +/// Объединяет пять последовательностей в последовательность пятиэлементных кортежей +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4): sequence of (T, T1, T2, T3, T4); +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(a: sequence of T; b: sequence of T1; fun: (T,T1) -> TRes): sequence of TRes; +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; fun: (T,T1,T2) -> TRes): sequence of TRes; +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; fun: (T,T1,T2,T3) -> TRes): sequence of TRes; +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4; fun: (T,T1,T2,T3,T4) -> TRes): sequence of TRes; + +/// Возвращает декартово произведение последовательностей, проектируя каждую пару на значение +function Cartesian(a: sequence of T; b: sequence of T1; func: (T,T1)->TRes): sequence of TRes; +/// Возвращает декартово произведение последовательностей, проектируя каждую тройку на значение +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; func: (T,T1,T2)->TRes): sequence of TRes; +/// Возвращает декартово произведение последовательностей, проектируя каждую четвёрку на значение +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; func: (T,T1,T2,T3)->TRes): sequence of TRes; +/// Возвращает декартово произведение последовательностей, проектируя каждую пятёрку на значение +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4; func: (T,T1,T2,T3,T4)->TRes): sequence of TRes; +/// Возвращает декартово произведение последовательностей в виде последовательности пар +function Cartesian(a: sequence of T; b: sequence of T1): sequence of (T, T1); +/// Возвращает декартово произведение последовательностей в виде последовательности троек +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2): sequence of (T, T1, T2); +/// Возвращает декартово произведение последовательностей в виде последовательности четвёрок +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3): sequence of (T, T1, T2, T3); +/// Возвращает декартово произведение последовательностей в виде последовательности пятёрок +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4): sequence of (T, T1, T2, T3, T4); + /// Возвращает последовательность из n целых, введенных с клавиатуры function ReadSeqInteger(n: integer): sequence of integer; @@ -5372,6 +5406,119 @@ begin end; end; +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(a: sequence of T; b: sequence of T1; fun: (T,T1) -> TRes): sequence of TRes; +begin + var aen := a.GetEnumerator; + var ben := b.GetEnumerator; + while aen.MoveNext and ben.MoveNext do + yield fun(aen.Current,ben.Current) +end; + +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; fun: (T,T1,T2) -> TRes): sequence of TRes; +begin + var aen := a.GetEnumerator; + var ben := b.GetEnumerator; + var cen := c.GetEnumerator; + while aen.MoveNext and ben.MoveNext and cen.MoveNext do + yield fun(aen.Current,ben.Current,cen.Current) +end; + +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; fun: (T,T1,T2,T3) -> TRes): sequence of TRes; +begin + var aen := a.GetEnumerator; + var ben := b.GetEnumerator; + var cen := c.GetEnumerator; + var den := d.GetEnumerator; + while aen.MoveNext and ben.MoveNext and cen.MoveNext and den.MoveNext do + yield fun(aen.Current,ben.Current,cen.Current,den.Current) +end; + +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4; fun: (T,T1,T2,T3,T4) -> TRes): sequence of TRes; +begin + var aen := a.GetEnumerator; + var ben := b.GetEnumerator; + var cen := c.GetEnumerator; + var den := d.GetEnumerator; + var een := e.GetEnumerator; + while aen.MoveNext and ben.MoveNext and cen.MoveNext and den.MoveNext and een.MoveNext do + yield fun(aen.Current,ben.Current,cen.Current,den.Current,een.Current) +end; + +/// Объединяет две последовательности в последовательность двухэлементных кортежей +function Zip(a: sequence of T; b: sequence of T1): sequence of (T, T1) + := Zip(a,b,(ax,bx) -> (ax,bx)); + +/// Объединяет три последовательности в последовательность трехэлементных кортежей +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2): sequence of (T, T1, T2) + := Zip(a,b,c,(ax,bx,cx) -> (ax,bx,cx)); + +/// Объединяет четыре последовательности в последовательность четырехэлементных кортежей +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3): sequence of (T, T1, T2, T3) + := Zip(a,b,c,d,(ax,bx,cx,dx) -> (ax,bx,cx,dx)); + +/// Объединяет пять последовательностей в последовательность пятиэлементных кортежей +function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4): sequence of (T, T1, T2, T3, T4) + := Zip(a,b,c,d,e,(ax,bx,cx,dx,ex) -> (ax,bx,cx,dx,ex)); + +/// Возвращает декартово произведение последовательностей, проектируя каждую пару на значение +function Cartesian(a: sequence of T; b: sequence of T1; func: (T,T1)->TRes): sequence of TRes; +begin + foreach var xa in a do + foreach var xb in b do + yield func(xa, xb) +end; + +/// Возвращает декартово произведение последовательностей, проектируя каждую тройку на значение +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; func: (T,T1,T2)->TRes): sequence of TRes; +begin + foreach var xa in a do + foreach var xb in b do + foreach var xc in c do + yield func(xa, xb, xc) +end; + +/// Возвращает декартово произведение последовательностей, проектируя каждую четвёрку на значение +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; func: (T,T1,T2,T3)->TRes): sequence of TRes; +begin + foreach var xa in a do + foreach var xb in b do + foreach var xc in c do + foreach var xd in d do + yield func(xa, xb, xc, xd) +end; + +/// Возвращает декартово произведение последовательностей, проектируя каждую пятёрку на значение +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4; func: (T,T1,T2,T3,T4)->TRes): sequence of TRes; +begin + foreach var xa in a do + foreach var xb in b do + foreach var xc in c do + foreach var xd in d do + foreach var xe in e do + yield func(xa, xb, xc, xd, xe) +end; + +/// Возвращает декартово произведение последовательностей в виде последовательности пар +function Cartesian(a: sequence of T; b: sequence of T1): sequence of (T, T1) + := Cartesian(a,b,(xa,xb) -> (xa,xb)); + +/// Возвращает декартово произведение последовательностей в виде последовательности троек +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2): sequence of (T, T1, T2) + := Cartesian(a,b,c,(xa,xb,xc) -> (xa,xb,xc)); + +/// Возвращает декартово произведение последовательностей в виде последовательности четвёрок +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3): sequence of (T, T1, T2, T3) + := Cartesian(a,b,c,d,(xa,xb,xc,xd) -> (xa,xb,xc,xd)); + +/// Возвращает декартово произведение последовательностей в виде последовательности пятёрок +function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4): sequence of (T, T1, T2, T3, T4) + := Cartesian(a,b,c,d,e,(xa,xb,xc,xd,xe) -> (xa,xb,xc,xd,xe)); + + function SeqGen(count: integer; first: T; next: T->T): sequence of T; begin if count < 1 then @@ -10700,7 +10847,7 @@ begin end; end; -/// Возвращает сумму элементов последовательности, спроектированных на числовое значение - пока не работает для Lst(1,2,3) +// Возвращает сумму элементов последовательности, спроектированных на числовое значение - пока не работает для Lst(1,2,3) {function Sum(Self: sequence of T; f: T->BigInteger): BigInteger; extensionmethod; begin Result := 0; @@ -10797,6 +10944,7 @@ end; // Дополнения февраль 2016: MinBy, MaxBy, TakeLast, Slice, Cartesian, SplitAt, // Partition, ZipTuple, UnZipTuple, Interleave, Numerate, Tabulate, Pairwise, Batch +// Дополнения 2024: Zip - синоним ZipTuple /// Возвращает первый элемент последовательности с минимальным значением ключа function MinBy(Self: sequence of T; selector: T->TKey): T; extensionmethod; @@ -10912,28 +11060,6 @@ begin Result := Self.Reverse.Skip(count).Reverse; end; -/// Возвращает декартово произведение последовательностей в виде последовательности пар -function Cartesian(Self: sequence of T; b: sequence of T1): sequence of (T, T1); extensionmethod; -begin - if b = nil then - raise new System.ArgumentNullException('b'); - - foreach var x in Self do - foreach var y in b do - yield (x, y) -end; - -/// Возвращает декартово произведение последовательностей, проектируя каждую пару на значение -function Cartesian(Self: sequence of T; b: sequence of T1; func: (T,T1)->T2): sequence of T2; extensionmethod; -begin - if b = nil then - raise new System.ArgumentNullException('b'); - - foreach var x in Self do - foreach var y in b do - yield func(x, y) -end; - /// Разбивает последовательность на две в позиции ind. Реализуется двухпроходным алгоритмом function SplitAt(Self: sequence of T; ind: integer): (sequence of T, sequence of T); extensionmethod; begin @@ -10956,65 +11082,86 @@ begin Result := (Self.Where(cond), Self.Where((x, i) -> not cond(x, i))); end; -/// Объединяет две последовательности в последовательность двухэлементных кортежей -function ZipTuple(Self: sequence of T; a: sequence of T1): sequence of (T, T1); extensionmethod; -begin - if a = nil then - raise new System.ArgumentNullException('a'); - Result := Self.Zip(a, (x, y) -> (x, y)); -end; -/// Объединяет три последовательности в последовательность трехэлементных кортежей -function ZipTuple(Self: sequence of T; a: sequence of T1; b: sequence of T2): sequence of (T, T1, T2); extensionmethod; -begin - if a = nil then - raise new System.ArgumentNullException('a'); - if b = nil then - raise new System.ArgumentNullException('b'); - Result := Self.Zip(a, (x, y) -> (x, y)).Zip(b, (p, z) -> (p[0], p[1], z)); -end; +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(Self: sequence of T; b: sequence of T1; c: sequence of T2; func: (T,T1,T2) -> TRes): sequence of TRes; extensionmethod + := Zip(Self,b,c,func); + +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(Self: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; func: (T,T1,T2,T3) -> TRes): sequence of TRes; extensionmethod + := Zip(Self,b,c,d,func); + +/// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов +function Zip(Self: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4; func: (T,T1,T2,T3,T4) -> TRes): sequence of TRes; extensionmethod + := Zip(Self,b,c,d,e,func); -/// Объединяет четыре последовательности в последовательность четырехэлементных кортежей -function ZipTuple(Self: sequence of T; a: sequence of T1; b: sequence of T2; c: sequence of T3): sequence of (T, T1, T2, T3); extensionmethod; -begin - if a = nil then - raise new System.ArgumentNullException('a'); - if b = nil then - raise new System.ArgumentNullException('b'); - if c = nil then - raise new System.ArgumentNullException('c'); - Result := Self.Zip(a, (x, y)-> (x, y)).Zip(b, (p, z) -> (p[0], p[1], z)).Zip(c, (p, z) -> (p[0], p[1], p[2], z)); -end; /// Объединяет две последовательности в последовательность двухэлементных кортежей -function Zip(Self: sequence of T; a: sequence of T1): sequence of (T, T1); extensionmethod; -begin - if a = nil then - raise new System.ArgumentNullException('a'); - Result := Self.Zip(a, (x, y) -> (x, y)); -end; +function Zip(Self: sequence of T; b: sequence of T1): sequence of (T, T1); extensionmethod + := Zip(Self,b); /// Объединяет три последовательности в последовательность трехэлементных кортежей -function Zip(Self: sequence of T; a: sequence of T1; b: sequence of T2): sequence of (T, T1, T2); extensionmethod; -begin - if a = nil then - raise new System.ArgumentNullException('a'); - if b = nil then - raise new System.ArgumentNullException('b'); - Result := Self.Zip(a, (x, y) -> (x, y)).Zip(b, (p, z) -> (p[0], p[1], z)); -end; +function Zip(Self: sequence of T; b: sequence of T1; c: sequence of T2): sequence of (T, T1, T2); extensionmethod + := Zip(Self,b,c); /// Объединяет четыре последовательности в последовательность четырехэлементных кортежей -function Zip(Self: sequence of T; a: sequence of T1; b: sequence of T2; c: sequence of T3): sequence of (T, T1, T2, T3); extensionmethod; -begin - if a = nil then - raise new System.ArgumentNullException('a'); - if b = nil then - raise new System.ArgumentNullException('b'); - if c = nil then - raise new System.ArgumentNullException('c'); - Result := Self.Zip(a, (x, y) -> (x, y)).Zip(b, (p, z) -> (p[0], p[1], z)).Zip(c, (p, z) -> (p[0], p[1], p[2], z)); -end; +function Zip(Self: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3): sequence of (T, T1, T2, T3); extensionmethod + := Zip(Self,b,c,d); + +/// Объединяет четыре последовательности в последовательность четырехэлементных кортежей +function Zip(Self: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4): sequence of (T, T1, T2, T3, T4); extensionmethod + := Zip(Self,b,c,d,e); + + +/// Возвращает декартово произведение последовательностей, проектируя каждую пару на значение +function Cartesian(Self: sequence of T; b: sequence of T1; func: (T,T1)->TRes): sequence of TRes; extensionmethod + := Cartesian(Self,b,func); + +/// Возвращает декартово произведение последовательностей, проектируя каждую тройку на значение +function Cartesian(Self: sequence of T; b: sequence of T1; c: sequence of T2; func: (T,T1,T2)->TRes): sequence of TRes; extensionmethod + := Cartesian(Self,b,c,func); + +/// Возвращает декартово произведение последовательностей, проектируя каждую четвёрку на значение +function Cartesian(Self: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; func: (T,T1,T2,T3)->TRes): sequence of TRes; extensionmethod + := Cartesian(Self,b,c,d,func); + +/// Возвращает декартово произведение последовательностей, проектируя каждую пятёрку на значение +function Cartesian(Self: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4; func: (T,T1,T2,T3,T4)->TRes): sequence of TRes; extensionmethod + := Cartesian(Self,b,c,d,e,func); + + +/// Возвращает декартово произведение последовательностей в виде последовательности пар +function Cartesian(Self: sequence of T; b: sequence of T1): sequence of (T, T1); extensionmethod + := Cartesian(Self,b); + +/// Возвращает декартово произведение последовательностей в виде последовательности троек +function Cartesian(Self: sequence of T; b: sequence of T1; c: sequence of T2): sequence of (T, T1, T2); extensionmethod + := Cartesian(Self,b,c); + +/// Возвращает декартово произведение последовательностей в виде последовательности четвёрок +function Cartesian(Self: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3): sequence of (T, T1, T2, T3); extensionmethod + := Cartesian(Self,b,c,d); + +/// Возвращает декартово произведение последовательностей в виде последовательности пятёрок +function Cartesian(Self: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4): sequence of (T, T1, T2, T3, T4); extensionmethod + := Cartesian(Self,b,c,d,e); + + + + + +/// Объединяет две последовательности в последовательность двухэлементных кортежей +function ZipTuple(Self: sequence of T; a: sequence of T1): sequence of (T, T1); extensionmethod + := Self.Zip(a); + +/// Объединяет три последовательности в последовательность трехэлементных кортежей +function ZipTuple(Self: sequence of T; a: sequence of T1; b: sequence of T2): sequence of (T, T1, T2); extensionmethod + := Self.Zip(a,b); + +/// Объединяет четыре последовательности в последовательность четырехэлементных кортежей +function ZipTuple(Self: sequence of T; a: sequence of T1; b: sequence of T2; c: sequence of T3): sequence of (T, T1, T2, T3); extensionmethod + := Self.Zip(a,b,c); + /// Разъединяет последовательность двухэлементных кортежей на две последовательности. Реализуется двухпроходным алгоритмом function UnZipTuple(Self: sequence of (T, T1)): (sequence of T, sequence of T1); extensionmethod; diff --git a/bin/PascalABCNET.chm b/bin/PascalABCNET.chm index bb19ecf65..09db06199 100644 Binary files a/bin/PascalABCNET.chm and b/bin/PascalABCNET.chm differ