GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
# This file was created automatically, do not edit!
#############################################################################
##
#W test.tst GAP 4 package Browse Thomas Breuer
#W Frank Lübeck
##
#Y Copyright (C) 2013, Lehrstuhl D für Mathematik, RWTH Aachen, Germany
##
## This file contains the GAP code of the examples in the package
## documentation files.
##
## In order to run the tests, one starts GAP from the `tst' subdirectory
## of the `pkg/Browse' directory, and calls `Test( "test.tst" );'.
##
gap> LoadPackage( "Browse", false );
true
gap> save:= SizeScreen();;
gap> SizeScreen( [ 72 ] );;
gap> START_TEST( "Input file: test.tst" );
##
gap> oldinterval:= BrowseData.defaults.dynamic.replayDefaults.replayInterval;;
gap> BrowseData.defaults.dynamic.replayDefaults.replayInterval:= 1;;
## doc/../lib/ncurses.gi (856-869)
gap> win := NCurses.newwin(0,0,0,0);; pan := NCurses.new_panel(win);;
gap> defc := NCurses.defaultColors;;
gap> NCurses.wmove(win, 0, 0);;
gap> for a in defc do for b in defc do
> NCurses.wattrset(win, NCurses.ColorAttr(a, b));
> NCurses.waddstr(win, Concatenation(a,"/",b,"\t"));
> od; od;
gap> if NCurses.IsStdoutATty() then
> NCurses.update_panels();; NCurses.doupdate();;
> NCurses.napms(5000);; # show for 5 seconds
> NCurses.endwin();; NCurses.del_panel(pan);; NCurses.delwin(win);;
> fi;
## doc/../lib/ncurses.gi (120-130)
gap> NCurses.IsAttributeLine( "abc" );
true
gap> NCurses.IsAttributeLine( [ "abc", "def" ] );
false
gap> NCurses.IsAttributeLine( [ NCurses.attrs.UNDERLINE, true, "abc" ] );
true
gap> NCurses.IsAttributeLine( "" ); NCurses.IsAttributeLine( [] );
true
false
## doc/../lib/ncurses.gi (193-206)
gap> plain_str:= "hello";;
gap> with_attr:= [ NCurses.attrs.BOLD, "bold" ];;
gap> NCurses.ConcatenationAttributeLines( [ plain_str, plain_str ] );
"hellohello"
gap> NCurses.ConcatenationAttributeLines( [ plain_str, with_attr ] );
[ "hello", 2097152, "bold" ]
gap> NCurses.ConcatenationAttributeLines( [ with_attr, plain_str ] );
[ 2097152, "bold", 0, "hello" ]
gap> NCurses.ConcatenationAttributeLines( [ with_attr, with_attr ] );
[ 2097152, "bold", 0, 2097152, "bold" ]
gap> NCurses.ConcatenationAttributeLines( [ with_attr, with_attr ], true );
[ 2097152, "bold", 2097152, "bold" ]
## doc/../lib/ncurses.gi (318-323)
gap> NCurses.RepeatedAttributeLine( "12345", 23 );
"12345123451234512345123"
gap> NCurses.RepeatedAttributeLine( [ NCurses.attrs.BOLD, "12345" ], 13 );
[ 2097152, "12345", 0, 2097152, "12345", 0, 2097152, "123" ]
## doc/../lib/ncurses.gi (1089-1095)
gap> NCurses.WidthAttributeLine( "abcde" );
5
gap> NCurses.WidthAttributeLine( [ NCurses.attrs.BOLD, "abc",
> NCurses.attrs.NORMAL, "de" ] );
5
## doc/../lib/ncurses.gi (3202-3209)
gap> NCurses.Alert( "Hello world!", 1000 );
fail
gap> NCurses.Alert( [ "Hello world!",
> [ "Hello ", NCurses.attrs.BOLD, "bold!" ] ], 1500,
> NCurses.ColorAttr( "red", -1 ) + NCurses.attrs.BOLD );
fail
## doc/../lib/browse.gi (246-258)
gap> BrowseData.IsBrowseTableCellData( "abc" );
true
gap> BrowseData.IsBrowseTableCellData( [ "abc", "def" ] );
true
gap> BrowseData.IsBrowseTableCellData( rec( rows:= [ "ab", "cd" ],
> align:= "tl" ) );
true
gap> BrowseData.IsBrowseTableCellData( "" );
true
gap> BrowseData.IsBrowseTableCellData( [] );
true
## doc/../lib/browse.gi (1994-2000)
gap> BrowseData.BlockEntry( "abc", 3, 5 );
[ " ", " abc", " " ]
gap> BrowseData.BlockEntry( rec( rows:= [ "ab", "cd" ],
> align:= "tl" ), 3, 5 );
[ "ab ", "cd ", " " ]
## doc/../lib/browse.gi (440-447)
gap> m:= 10;; n:= 5;;
gap> xpl1:= rec( work:= rec(
> main:= List( [ 1 .. m ], i -> List( [ 1 .. n ],
> j -> String( [ i, j ] ) ) ) ) );;
gap> BrowseData.IsBrowseTable( xpl1 );
true
## doc/../lib/browse.gi (454-467)
gap> m:= 6;; n:= 5;;
gap> xpl2:= rec( work:= rec(
> main:= List( [ 1 .. m ], i -> List( [ 1 .. n ],
> j -> rec( rows:= List( [ -i*j, i*j*1000+j, i-j ], String ),
> align:= "c" ) ) ),
> labelsRow:= List( [ 1 .. m ], i -> [ String( i ) ] ),
> labelsCol:= [ List( [ 1 .. n ], String ) ],
> sepRow:= "-",
> sepCol:= "|",
> ) );;
gap> BrowseData.IsBrowseTable( xpl2 );
true
## doc/../lib/browse.gi (476-516)
gap> m:= 30;; n:= 25;;
gap> xpl3:= rec( work:= rec(
> header:= [ " Example 3" ],
> labelsRow:= List( [ 1 .. 30 ], i -> [ String( i ) ] ),
> sepLabelsRow:= " % ",
> sepLabelsCol:= "=",
> sepRow:= "*",
> sepCol:= " |",
> footer:= t -> [ Concatenation( "top-left entry is: ",
> String( t.dynamic.topleft{ [ 1, 2] } ) ) ],
> ) );;
gap> if NCurses.attrs.has_colors then
> xpl3.work.main:= List( [ 1 .. m ], i -> List( [ 1 .. n ],
> j -> rec( rows:= [ String( -i*j ),
> [ NCurses.attrs.BOLD, true,
> NCurses.attrs.ColorPairs[56+1], true,
> String( i*j*1000+j ),
> NCurses.attrs.NORMAL, true ],
> String( i-j ) ],
> align:= "c" ) ) );
> xpl3.work.labelsCol:= [ List( [ 1 .. 30 ], i -> [
> NCurses.attrs.ColorPairs[ 56+4 ], true,
> String( i ),
> NCurses.attrs.NORMAL, true ] ) ];
> else
> xpl3.work.main:= List( [ 1 .. m ], i -> List( [ 1 .. n ],
> j -> rec( rows:= [ String( -i*j ),
> [ NCurses.attrs.BOLD, true,
> String( i*j*1000+j ),
> NCurses.attrs.NORMAL, true ],
> String( i-j ) ],
> align:= "c" ) ) );
> xpl3.work.labelsCol:= [ List( [ 1 .. 30 ], i -> [
> NCurses.attrs.BOLD, true,
> String( i ),
> NCurses.attrs.NORMAL, true ] ) ];
> fi;
gap> BrowseData.IsBrowseTable( xpl3 );
true
## doc/../lib/browse.gi (527-545)
gap> xpl4:= rec(
> defc:= NCurses.defaultColors,
> wd:= Maximum( List( ~.defc, Length ) ),
> ca:= NCurses.ColorAttr,
> work:= rec(
> header:= [ "Examples of NCurses.ColorAttr" ],
> main:= List( ~.defc, i -> List( ~.defc,
> j -> [ [ ~.ca( i, j ), String( i, ~.wd ) ], # no true!
> [ ~.ca( i, j ), true, String( "on", ~.wd ) ],
> [ ~.ca( i, j ), String( j, ~.wd ) ] ] ) ), # no true!
> labelsRow:= List( ~.defc, i -> [ String( i ) ] ),
> labelsCol:= [ List( ~.defc, String ) ],
> sepRow:= "-",
> sepCol:= [ " |", "|" ],
> ) );;
gap> BrowseData.IsBrowseTable( xpl4 );
true
## doc/../lib/browse.gi (5420-5431)
gap> xpl1.work.ShowHelp:= BrowseData.ShowHelpPager;;
gap> BrowseData.SetReplay( "?Q" );
gap> Unbind( xpl1.dynamic );
gap> NCurses.BrowseGeneric( xpl1 );
gap> xpl1.work.ShowHelp:= BrowseData.ShowHelpTable;;
gap> BrowseData.SetReplay( "?dQQ" );
gap> Unbind( xpl1.dynamic );
gap> NCurses.BrowseGeneric( xpl1 );
gap> BrowseData.SetReplay( false );
gap> Unbind( xpl1.dynamic );
## doc/../app/matdisp.g (108-124)
gap> n:= [ 14, 14, 14, 14 ];;
gap> input:= Concatenation( n, n, n, "Q" );; # ``do nothing and quit''
gap> BrowseData.SetReplay( input );
gap> Browse( RandomMat( 10, 10, Integers ) );
gap> BrowseData.SetReplay( input );
gap> Browse( RandomMat( 10, 10, GF(3) ) );
gap> BrowseData.SetReplay( input );
gap> Browse( RandomMat( 10, 10, GF(4) ) );
gap> BrowseData.SetReplay( input );
gap> Browse( RandomMat( 10, 10, Integers mod 6 ) );
gap> BrowseData.SetReplay( input );
gap> Browse( RandomMat( 10, 10, GF( NextPrimeInt( 2^16 ) ) ) );
gap> BrowseData.SetReplay( input );
gap> Browse( RandomMat( 10, 10, GF( 2^20 ) ) );
gap> BrowseData.SetReplay( false );
## doc/../app/ctbldisp.g (60-82)
gap> if TestPackageAvailability( "CTblLib" ) = true then
> BrowseData.SetReplay( Concatenation(
> # scroll in the table
> "DRULdddddrrrrrlluu",
> # select an entry and move it around
> "seddrruuuddlll",
> # search for the pattern 135 (six times)
> "/135", [ NCurses.keys.ENTER ], "nnnnn",
> # deselect the entry, select the first column
> "qLsc",
> # sort and categorize by this column
> "sc",
> # select the first row, move down the selection
> "srdddd",
> # expand the selected category, scroll the selection down
> "xd",
> # and quit the application
> "Q" ) );
> Browse( CharacterTable( "HN" ) );
> BrowseData.SetReplay( false );
> fi;
## doc/../app/ctbldisp.g (685-697)
gap> BrowseData.SetReplay( Concatenation(
> # select the first entry
> "se",
> # scroll in the table
> "drrrr",
> # keep the table open for a while
> [ 14, 14, 14, 14, 14 ],
> # and quit the application
> "Q" ) );
gap> BrowseDecompositionMatrix( CharacterTable( "J1" ) mod 2 );
gap> BrowseData.SetReplay( false );
## doc/../app/tomdisp.g (41-58)
gap> if TestPackageAvailability( "TomLib" ) = true then
> BrowseData.SetReplay( Concatenation(
> # scroll in the table
> "DDRRR",
> # search for the (exact) value 100 (three times)
> "/100",
> [ NCurses.keys.DOWN, NCurses.keys.DOWN, NCurses.keys.RIGHT ],
> [ NCurses.keys.DOWN, NCurses.keys.DOWN, NCurses.keys.DOWN ],
> [ NCurses.keys.RIGHT, NCurses.keys.ENTER ], "nn",
> # no more occurrences of 100, confirm
> [ NCurses.keys.ENTER ],
> # and quit the application
> "Q" ) );
> Browse( TableOfMarks( "A10" ) );
> BrowseData.SetReplay( false );
> fi;
## doc/../app/atlasbrowse.g (524-553)
gap> d:= [ NCurses.keys.DOWN ];; r:= [ NCurses.keys.RIGHT ];;
gap> c:= [ NCurses.keys.ENTER ];;
gap> BrowseData.SetReplay( Concatenation(
> "/A5", # Find the string A5 ...
> d, d, r, # ... such that just the word matches,
> c, # start the search,
> c, # click the table entry A5,
> d, d, # move down two rows,
> c, # click the row for this representation,
> "Q", # quit the second level table,
> d, d, # move down two rows,
> c, # click the table entry A6,
> d, # move down one row,
> c, # click the first row,
> "Q", # quit the second level table,
> "Q" ) ); # and quit the application.
gap> if IsBound( BrowseAtlasInfo ) and IsBound( AtlasProgramInfo ) then
> tworeps:= BrowseAtlasInfo();
> else
> tworeps:= [ fail ];
> fi;
gap> BrowseData.SetReplay( false );
gap> if fail in tworeps then
> Print( "no access to the Web ATLAS\n" );
> else
> Print( List( tworeps, x -> x.identifier[1] ), "\n" );
[ "A5", "A6" ]
> fi;
## doc/../app/manual.g (69-81)
gap> n:= [ 14, 14, 14 ];; # ``do nothing''
gap> BrowseData.SetReplay( Concatenation(
> "xdxd", # expand a Tutorial section
> n, "Q" ) ); # and quit
gap> BrowseGapManuals( "inline/collapsed" );
gap> BrowseData.SetReplay( Concatenation(
> "/Browse", [ NCurses.keys.ENTER ], # search for "Browse"
> "xdxddxd", # expand a section
> n, "Q" ) ); # and quit
gap> BrowseGapManuals( "inline/collapsed" );
gap> BrowseData.SetReplay( false );
## doc/../app/gapbibl.g (364-366)
gap> file:= Filename( DirectoriesLibrary( "doc" ), "manualbib.xml" );;
## doc/../app/gapbibl.g (404-416)
gap> # sort and categorize by year, scroll down, expand a category row
gap> BrowseData.SetReplay( "scrrscsedddddxdddddQ" );
gap> BrowseBibliography();;
gap> # sort & categorize by authors, expand all category rows, scroll down
gap> BrowseData.SetReplay( "scscXseddddddQ" );
gap> BrowseBibliography();;
gap> # sort and categorize by journal, search for a journal name, expand
gap> BrowseData.SetReplay( Concatenation( "scrrrsc/J. Algebra",
> [ NCurses.keys.ENTER ], "nxdddQ" ) );
gap> BrowseBibliography();;
gap> BrowseData.SetReplay( false );
## doc/../app/profile.g (56-73)
gap> n:= [ 14, 14, 14, 14, 14 ];; # ``do nothing''
gap> ProfileOperationsAndMethods( true ); # collect some data
gap> ConjugacyClasses( PrimitiveGroup( 24, 1 ) );;
gap> ProfileOperationsAndMethods( false );
gap> BrowseData.SetReplay( Concatenation(
> "scso", # sort by column 1,
> n,
> "rso", # sort by column 2,
> n,
> "rso", # sort by column 3,
> n,
> "q", # deselect the column,
> "/Centralizer", [ NCurses.keys.ENTER ], # search for a function,
> n, "Q" ) ); # and quit
gap> BrowseProfile();
gap> BrowseData.SetReplay( false );
## doc/../app/userpref.g (254-270)
gap> d:= [ NCurses.keys.DOWN ];;
gap> c:= [ NCurses.keys.ENTER ];;
gap> BrowseData.SetReplay( Concatenation(
> "/PackagesToLoad", # enter a search string,
> c, # start the search,
> c, # edit the entry (a list of choices),
> " ", d, # toggle the first four values,
> " ", d, #
> " ", d, #
> " ", d, #
> c, # submit the values,
> "Q", # quit the table,
> c ) ); # choose "cancel": do not apply the changes.
gap> BrowseUserPreferences();
gap> BrowseData.SetReplay( false );
## doc/../app/gapdata.g (135-147)
gap> n:= [ 14, 14, 14 ];; # ``do nothing''
gap> # open the overview of Conway polynomials
gap> BrowseData.SetReplay( Concatenation( "/Conway Polynomials",
> [ NCurses.keys.ENTER, NCurses.keys.ENTER ], "srdddd", n, "Q" ) );
gap> BrowseGapData();;
gap> # open the overview of GAP packages
gap> BrowseData.SetReplay( Concatenation( "/GAP Packages",
> [ NCurses.keys.ENTER, NCurses.keys.ENTER ], "/Browse",
> [ NCurses.keys.ENTER ], "n", n, "Q" ) );
gap> BrowseGapData();;
gap> BrowseData.SetReplay( false );
## doc/../app/filetree.g (118-130)
gap> n:= [ 14, 14, 14 ];; # ``do nothing''
gap> BrowseData.SetReplay( Concatenation(
> "q", # leave the selection
> "X", # expand all categories
> "/filetree", [ NCurses.keys.ENTER ], # search for "filetree"
> n, "Q" ) ); # and quit
gap> dir:= DirectoriesPackageLibrary( "Browse", "" )[1];;
gap> if IsBound( BrowseDirectory ) then
> BrowseDirectory( dir );
> fi;
gap> BrowseData.SetReplay( false );
## doc/../app/puzzle.g (89-94)
gap> BrowseData.SetReplay( Concatenation(
> BrowsePuzzleSolution.steps, "Q" ) );
gap> BrowsePuzzle( 4, 4, BrowsePuzzleSolution.init );;
gap> BrowseData.SetReplay( false );
## doc/../app/solitair.g (123-133)
gap> for n in [ 33, 37, 45 ] do
> BrowseData.SetReplay( Concatenation(
> PegSolitaireSolutions.( String( n ) ), "Q" ) );
> PegSolitaire( n );
> PegSolitaire( "large", n );
> PegSolitaire( n, true );
> PegSolitaire( "large", n, true );
> od;
gap> BrowseData.SetReplay( false );
## doc/../app/rubik.g (94-103)
gap> cubegens := [
> ( 1, 3, 8, 6)( 2, 5, 7, 4)( 9,33,25,17)(10,34,26,18)(11,35,27,19),
> ( 9,11,16,14)(10,13,15,12)( 1,17,41,40)( 4,20,44,37)( 6,22,46,35),
> (17,19,24,22)(18,21,23,20)( 6,25,43,16)( 7,28,42,13)( 8,30,41,11),
> (25,27,32,30)(26,29,31,28)( 3,38,43,19)( 5,36,45,21)( 8,33,48,24),
> (33,35,40,38)(34,37,39,36)( 3, 9,46,32)( 2,12,47,29)( 1,14,48,27),
> (41,43,48,46)(42,45,47,44)(14,22,30,38)(15,23,31,39)(16,24,32,40)
> ];;
## doc/../app/rubik.g (145-158)
gap> choice:= List( [ 1 .. 30 ], i -> Random( [ 1 .. 6 ] ) );;
gap> input:= List( "tlfrbd", IntChar ){ choice };;
gap> BrowseData.SetReplay( Concatenation(
> input{ [ 1 .. 20 ] },
> "s", # switch to number display
> input{ [ 21 .. 25 ] },
> "s", # switch to color display
> input{ [ 26 .. 30 ] },
> "Q" ) );; # quit the browse table
gap> BrowseRubiksCube( Product( cubegens{ choice } ) );;
gap> BrowseRubiksCube( "large", Product( cubegens{ choice } ) );;
gap> BrowseData.SetReplay( false );
## doc/../app/knight.g (79-85)
gap> for entry in BrowseChangeSidesSolutions do
> BrowseData.SetReplay( Concatenation( entry, "Q" ) );
> BrowseChangeSides();
> od;
gap> BrowseData.SetReplay( false );
## doc/../app/sudoku.g (238-241)
gap> game := Sudoku.Init(" 3 68 | 85 1 69| 97 53| 79 |\
> 6 47 |45 2 |89 2 1 | 4 8 7 | ");;
## doc/../app/sudoku.g (269-278)
gap> game := Sudoku.Init(" 3 68 | 85 1 69| 97 53| 79 |\
> 6 47 |45 2 |89 2 1 | 4 8 7 | ");;
gap> Sudoku.Place(game, 1, 3);; # 3 is already in first row
gap> IsBound(game.impossible);
true
gap> Sudoku.Place(game, 1, 2);; # 2 is not in row, col or subsquare
gap> IsBound(game.impossible);
false
## doc/../app/sudoku.g (297-303)
gap> Sudoku.RandomGame(5833750);
[ " 1 2 43 2 68 72 8 6 2 1 9 8 8 3 9 \
47 3 7 18 ", 5833750 ]
gap> last = Sudoku.RandomGame(last[2]);
true
## doc/../app/sudoku.g (313-328)
gap> game := Sudoku.Init(" 3 68 | 85 1 69| 97 53| 79 |\
> 6 47 |45 2 |89 2 1 | 4 8 7 | ");;
gap> Sudoku.SimpleDisplay(game);
3 | 6|8
85| 1| 69
9|7 | 53
-----------
| |79
6 | 47|
45 | 2 |
-----------
89 | 2| 1
4 | 8| 7
| |
## doc/../app/sudoku.g (409-425)
gap> s := " 5 | 154 6 2 |9 5 3 |6 4 | 8 |8 9 53\
> | 5 | 4 7 2| 91 8 ";;
gap> sol := Sudoku.UniqueSolution(Sudoku.Init(s));;
gap> Sudoku.SimpleDisplay(sol);
438|219|576
715|436|928
962|758|314
-----------
694|573|281
153|862|749
827|941|653
-----------
281|695|437
546|387|192
379|124|865
## doc/../app/rldemo.g (55-60)
gap> dirs := DirectoriesPackageLibrary("Browse");;
gap> demofile := Filename(dirs, "../app/demo.demo");;
gap> LoadDemoFile("My first demo", demofile);
gap> LoadDemoFile("My first demo (single lines)", demofile, true);
## doc/brdbattr.xml (89-95)
gap> n:= 100;;
gap> smallintenum1:= DatabaseIdEnumerator( rec(
> identifiers:= [ 1 .. n ],
> entry:= function( dbidenum, id ) return id; end,
> ) );;
## doc/brdbattr.xml (107-118)
gap> DatabaseAttributeAdd( smallintenum1, rec(
> identifier:= "primes",
> type:= "values",
> name:= "IsPrimeInt",
> ) );
gap> DatabaseAttributeAdd( smallintenum1, rec(
> identifier:= "prime powers",
> type:= "values",
> name:= "IsPrimePowerInt",
> ) );
## doc/brdbattr.xml (122-128)
gap> DatabaseAttributeAdd( smallintenum1, rec(
> identifier:= "factors",
> type:= "values",
> name:= "Factors",
> ) );
## doc/brdbattr.xml (136-142)
gap> DatabaseAttributeAdd( smallintenum1, rec(
> identifier:= "residue mod 11",
> type:= "values",
> create:= function( attr, id ) return id mod 11; end,
> ) );
## doc/brdbattr.xml (152-167)
gap> factorialdata:= function( n )
> local result, i, f;
> result:= []; i:= 1; f:= 1;;
> while f <= n do
> Add( result, [ f, i ] ); i:= i + 1; f:= f * i;
> od;
> return result;
> end;;
gap> DatabaseAttributeAdd( smallintenum1, rec(
> identifier:= "inverse factorial",
> type:= "pairs",
> data:= rec( automatic:= factorialdata( n ), nonautomatic:= [] ),
> isSorted:= true,
> ) );
## doc/brdbattr.xml (179-184)
gap> t1:= BrowseTableFromDatabaseIdEnumerator( smallintenum1,
> [ "self" ],
> [ "primes", "prime powers", "factors", "residue mod 11",
> "inverse factorial" ] );;
## doc/brdbattr.xml (188-203)
gap> nop:= [ 14, 14, 14, 14, 14, 14 ];; # ``do nothing''
gap> sample_session:= Concatenation(
> # categorize by the first column, expand categories, wait, reset
> nop, "scsc", nop, "X", nop, "!",
> # sort the residue column, wait, reset
> "scrrrso", nop, "!",
> # categorize by the inverse factorial column
> "rscsrdx", nop, "!",
> # and quit the application
> "qQ" );;
gap> BrowseData.SetReplay( sample_session );
gap> NCurses.BrowseGeneric( t1 );
gap> BrowseData.SetReplay( false );
gap> Unbind( t1.dynamic.replay );
## doc/brdbattr.xml (252-316)
gap> smallintenum2:= DatabaseIdEnumerator( rec(
> identifiers:= [ 1 .. n ],
> entry:= function( dbidenum, id ) return id; end,
> viewLabel:= "",
> ) );;
gap> DatabaseAttributeAdd( smallintenum2, rec(
> identifier:= "primes",
> type:= "values",
> name:= "IsPrimeInt",
> viewLabel:= "prime?",
> viewValue:= value -> BrowseData.ReplacedEntry( value,
> [ true, false ], [ "+", "-" ] ),
> sortParameters:= [ "add counter on categorizing", "yes" ],
> align:= "c",
> categoryValue:= value -> BrowseData.ReplacedEntry( value,
> [ true, false ], [ "prime", "nonprime" ] ),
> ) );
gap> DatabaseAttributeAdd( smallintenum2, rec(
> identifier:= "prime powers",
> type:= "values",
> name:= "IsPrimePowerInt",
> viewLabel:= "prime power?",
> viewValue:= value -> BrowseData.ReplacedEntry( value,
> [ true, false ], [ "+", "-" ] ),
> sortParameters:= [ "add counter on categorizing", "yes" ],
> align:= "c",
> categoryValue:= value -> BrowseData.ReplacedEntry( value,
> [ true, false ], [ "prime power", "not prime power" ] ),
> ) );
gap> DatabaseAttributeAdd( smallintenum2, rec(
> identifier:= "factors",
> type:= "values",
> name:= "Factors",
> viewLabel:= "factors",
> viewValue:= value -> JoinStringsWithSeparator( List( value, String ),
> " * "),
> widthCol:= 10,
> ) );
gap> DatabaseAttributeAdd( smallintenum2, rec(
> identifier:= "residue mod 11",
> type:= "values",
> create:= function( attr, id ) return id mod 11; end,
> viewSort:= BrowseData.SortAsIntegers,
> categoryValue:= res -> Concatenation( String( res ), " mod 11" ),
> ) );
gap> DatabaseAttributeAdd( smallintenum2, rec(
> identifier:= "inverse factorial",
> type:= "pairs",
> data:= rec( automatic:= factorialdata( n ), nonautomatic:= [] ),
> isSorted:= true,
> categoryValue:= function( k )
> if k = "" then
> return "(no factorial)";
> else
> return Concatenation( String( k ), "!" );
> fi;
> end,
> ) );
gap> t2:= BrowseTableFromDatabaseIdEnumerator( smallintenum2,
> [ "self" ],
> [ "primes", "prime powers", "factors", "residue mod 11",
> "inverse factorial" ],
> t -> BrowseData.HeaderWithRowCounter( t, "Small integers", n ) );;
## doc/brdbattr.xml (320-325)
gap> BrowseData.SetReplay( sample_session );
gap> NCurses.BrowseGeneric( t2 );
gap> BrowseData.SetReplay( false );
gap> Unbind( t2.dynamic.replay );
## doc/brdbattr.xml (348-386)
gap> DatabaseAttributeAdd( smallintenum2, rec(
> identifier:= "primes & prime powers",
> type:= "values",
> create:= function( attr, id )
> if IsPrimeInt( id ) then
> return 2;
> elif IsPrimePowerInt( id ) then
> return 1;
> else
> return 0;
> fi;
> end,
> viewLabel:= [ NCurses.attrs.BOLD + NCurses.ColorAttr( "red", -1 ),
> "prime", NCurses.attrs.NORMAL, " power?" ],
> viewValue:= value -> BrowseData.ReplacedEntry( value,
> [ 0, 1, 2 ], [ "-", "+",
> [ NCurses.attrs.BOLD + NCurses.ColorAttr( "red", -1 ),
> true, "+",
> NCurses.ColorAttr( "red", -1 ), false ] ] ),
> sortParameters:= [ "add counter on categorizing", "yes" ],
> align:= "c",
> categoryValue:= value -> BrowseData.ReplacedEntry( value,
> [ 0, 1, 2 ],
> [ "not prime power", "prime power, not prime", "prime" ] ),
> ) );
gap> t3:= BrowseTableFromDatabaseIdEnumerator( smallintenum2,
> [ "self" ],
> [ "primes & prime powers", "residue mod 11",
> "inverse factorial" ],
> t -> BrowseData.HeaderWithRowCounter( t, "Small integers", n ) );;
gap> sample_session2:= Concatenation(
> # categorize by the first column, expand categories, wait, reset
> nop, "scsc", nop, "X", nop, "!", "Q" );;
gap> BrowseData.SetReplay( sample_session2 );
gap> NCurses.BrowseGeneric( t3 );
gap> BrowseData.SetReplay( false );
gap> Unbind( t3.dynamic.replay );
## doc/brdbattr.xml (400-482)
gap> smallintenum3:= DatabaseIdEnumerator( rec(
> identifiers:= [ 1 .. n ],
> entry:= function( dbidenum, id ) return id; end,
> viewLabel:= "",
> version:= n,
> update:= function( dbidenum )
> dbidenum.identifiers:= [ 1 .. n ];
> dbidenum.version:= n;
> return true;
> end,
> ) );;
gap> updateByUnbindData:= function( attr )
> Unbind( attr.data );
> return true;
> end;;
gap> DatabaseAttributeAdd( smallintenum3, rec(
> identifier:= "primes",
> type:= "values",
> name:= "IsPrimeInt",
> viewLabel:= "prime?",
> viewValue:= value -> BrowseData.ReplacedEntry( value,
> [ true, false ], [ "+", "-" ] ),
> sortParameters:= [ "add counter on categorizing", "yes" ],
> align:= "c",
> categoryValue:= value -> BrowseData.ReplacedEntry( value,
> [ true, false ], [ "prime", "nonprime" ] ),
> version:= n,
> update:= updateByUnbindData,
> ) );
gap> DatabaseAttributeAdd( smallintenum3, rec(
> identifier:= "prime powers",
> type:= "values",
> name:= "IsPrimePowerInt",
> viewLabel:= "prime power?",
> viewValue:= value -> BrowseData.ReplacedEntry( value,
> [ true, false ], [ "+", "-" ] ),
> sortParameters:= [ "add counter on categorizing", "yes" ],
> align:= "c",
> categoryValue:= value -> BrowseData.ReplacedEntry( value,
> [ true, false ], [ "prime power", "not prime power" ] ),
> version:= n,
> update:= updateByUnbindData,
> ) );
gap> DatabaseAttributeAdd( smallintenum3, rec(
> identifier:= "factors",
> type:= "values",
> name:= "Factors",
> viewLabel:= "factors",
> viewValue:= value -> JoinStringsWithSeparator( List( value, String ),
> " * "),
> widthCol:= 10,
> version:= n,
> update:= updateByUnbindData,
> ) );
gap> DatabaseAttributeAdd( smallintenum3, rec(
> identifier:= "residue mod 11",
> type:= "values",
> create:= function( attr, id ) return id mod 11; end,
> viewSort:= BrowseData.SortAsIntegers,
> categoryValue:= res -> Concatenation( String( res ), " mod 11" ),
> version:= n,
> update:= updateByUnbindData,
> ) );
gap> DatabaseAttributeAdd( smallintenum3, rec(
> identifier:= "inverse factorial",
> type:= "pairs",
> data:= rec( automatic:= factorialdata( n ), nonautomatic:= [] ),
> isSorted:= true,
> categoryValue:= function( k )
> if k = "" then
> return "(no factorial)";
> else
> return Concatenation( String( k ), "!" );
> fi;
> end,
> version:= n,
> update:= function( attr )
> attr.data.automatic:= factorialdata( n );
> return true;
> end,
> ) );
## doc/brdbattr.xml (488-500)
gap> n:= 200;;
gap> DatabaseIdEnumeratorUpdate( smallintenum3 );
true
gap> t4:= BrowseTableFromDatabaseIdEnumerator( smallintenum3,
> [ "self" ], [ "primes", "prime powers", "factors", "residue mod 11",
> "inverse factorial" ],
> t -> BrowseData.HeaderWithRowCounter( t, "Small integers", n ) );;
gap> BrowseData.SetReplay( sample_session );
gap> NCurses.BrowseGeneric( t4 );
gap> BrowseData.SetReplay( false );
gap> Unbind( t4.dynamic.replay );
## doc/../app/tmdbattr.g (51-76)
gap> c:= [ NCurses.keys.ENTER ];;
gap> n:= [ 14, 14, 14 ];; # ``do nothing''
gap> BrowseData.SetReplay( Concatenation(
> "scrrsc", # categorize the list by source tables of fusions,
> "srdd", # choose a source table,
> "x", # expand the list of targets of fusions
> n,
> "!", # revert the categorization
> "q", # leave the mode in which a row is selected
> "scrrrrsc", # categorize the list by filenames
> "X", # expand all categories
> n,
> "!", # revert the categorization
> "scso", # sort the list by group order
> n,
> "!q", # revert the sorting and selection
> "?", # open the help window
> n,
> "Q", # close the help window
> "/A5", c, # search for the first occurrence of "A5"
> n,
> "Q" ) );; # and quit the browse table
gap> BrowseTomLibInfo();
gap> BrowseData.SetReplay( false );
##
gap> BrowseData.defaults.dynamic.replayDefaults.replayInterval:= oldinterval;;
##
gap> STOP_TEST( "test.tst", 10000000 );
gap> SizeScreen( save );;
#############################################################################
##
#E