Skip to content

Commit 274b3f5

Browse files
committed
Add ForAllX, ForAnyX, FilteredX, NumberX, PerformX
1 parent ebfcbea commit 274b3f5

File tree

3 files changed

+138
-0
lines changed

3 files changed

+138
-0
lines changed

lib/coll.gd

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2497,6 +2497,17 @@ DeclareOperation( "FoldLeftOp", [ IsListOrCollection, IsFunction, IsObject ] );
24972497
DeclareGlobalFunction( "FoldLeftX" );
24982498

24992499

2500+
#############################################################################
2501+
##
2502+
## TODO: document the following
2503+
##
2504+
DeclareGlobalFunction( "ForAllX" );
2505+
DeclareGlobalFunction( "ForAnyX" );
2506+
DeclareGlobalFunction( "FilteredX" );
2507+
DeclareGlobalFunction( "NumberX" );
2508+
DeclareGlobalFunction( "PerformX" );
2509+
2510+
25002511
#############################################################################
25012512
##
25022513
#F Sum( <list>[, <init>] ) . . . . . . . . . . sum of the elements of a list

lib/coll.gi

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1842,6 +1842,77 @@ InstallGlobalFunction( ProductX, function ( arg )
18421842
end );
18431843

18441844

1845+
#############################################################################
1846+
##
1847+
#M ForAllX(<obj>,...)
1848+
##
1849+
InstallGlobalFunction( ForAllX, function ( arg )
1850+
local f;
1851+
f := Remove(arg);
1852+
return FoldLeftX(arg, {acc,x} -> acc and CallFuncList(f, x), true, false);
1853+
end );
1854+
1855+
1856+
#############################################################################
1857+
##
1858+
#M ForAnyX(<obj>,...)
1859+
##
1860+
InstallGlobalFunction( ForAnyX, function ( arg )
1861+
local f;
1862+
f := Remove(arg);
1863+
return FoldLeftX(arg, {acc,x} -> acc or CallFuncList(f, x), false, true);
1864+
end );
1865+
1866+
1867+
#############################################################################
1868+
##
1869+
#M FilteredX(<obj>,...)
1870+
##
1871+
InstallGlobalFunction( FilteredX, function ( arg )
1872+
local f;
1873+
f := Remove(arg);
1874+
return FoldLeftX(arg,
1875+
function(acc, x)
1876+
if CallFuncList(f, x) then
1877+
Add(acc, ShallowCopy(x));
1878+
fi;
1879+
return acc;
1880+
end, []);
1881+
end);
1882+
1883+
1884+
#############################################################################
1885+
##
1886+
#M NumberX(<obj>,...)
1887+
##
1888+
InstallGlobalFunction( NumberX, function ( arg )
1889+
local f;
1890+
f := Remove(arg);
1891+
return FoldLeftX(arg,
1892+
function(acc, x)
1893+
if CallFuncList(f, x) then
1894+
return acc + 1;
1895+
fi;
1896+
return acc;
1897+
end, 0);
1898+
end);
1899+
1900+
1901+
#############################################################################
1902+
##
1903+
#M PerformX(<obj>,...)
1904+
##
1905+
InstallGlobalFunction( PerformX, function ( arg )
1906+
local f;
1907+
f := Remove(arg);
1908+
FoldLeftX(arg,
1909+
function(acc, x)
1910+
CallFuncList(f, x);
1911+
return 0;
1912+
end, 0);
1913+
end);
1914+
1915+
18451916
#############################################################################
18461917
##
18471918
#F Perform( <list>, <func> )

tst/testinstall/coll.tst

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,62 @@ gap> FoldLeft([1..3], \-);
330330
gap> FoldLeft([1..3], \-, 0);
331331
-6
332332
333+
#############################################################################
334+
#
335+
# ForAllX
336+
#
337+
gap> ForAllX([1..2], [3..4], function(i,j) Display([i,j]); return true; end);
338+
[ 1, 3 ]
339+
[ 1, 4 ]
340+
[ 2, 3 ]
341+
[ 2, 4 ]
342+
true
343+
gap> # verify short circuit works
344+
gap> ForAllX([1..2], [3..4], function(i,j) Display([i,j]); return false; end);
345+
[ 1, 3 ]
346+
false
347+
348+
#############################################################################
349+
#
350+
# ForAnyX
351+
#
352+
gap> ForAnyX([1..2], [3..4], function(i,j) Display([i,j]); return false; end);
353+
[ 1, 3 ]
354+
[ 1, 4 ]
355+
[ 2, 3 ]
356+
[ 2, 4 ]
357+
false
358+
gap> # verify short circuit works
359+
gap> ForAnyX([1..2], [3..4], function(i,j) Display([i,j]); return true; end);
360+
[ 1, 3 ]
361+
true
362+
363+
#############################################################################
364+
#
365+
# FilteredX
366+
#
367+
gap> FilteredX([1..4], IsEvenInt);
368+
[ [ 2 ], [ 4 ] ]
369+
gap> FilteredX([1..4], [1..4], \=);
370+
[ [ 1, 1 ], [ 2, 2 ], [ 3, 3 ], [ 4, 4 ] ]
371+
gap> FilteredX([1..6],[1..6],[1..6], {a,b,c} -> a+b+c<=4);
372+
[ [ 1, 1, 1 ], [ 1, 1, 2 ], [ 1, 2, 1 ], [ 2, 1, 1 ] ]
373+
374+
#############################################################################
375+
#
376+
# NumberX
377+
#
378+
gap> NumberX([1..4], IsEvenInt);
379+
gap> NumberX([1..4], [1..4], \=);
380+
gap> NumberX([1..6],[1..6],[1..6], {a,b,c} -> a+b+c<=4);
381+
382+
#############################################################################
383+
#
384+
# PerformX
385+
#
386+
gap> PerformX([1..2], [3..4], Print); Print("\n");
387+
13142324
388+
333389
#############################################################################
334390
#
335391
# List

0 commit comments

Comments
 (0)