1 USING: combinators.lib kernel sequences math
2 sequences.private shuffle ;
6 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
8 : map-reduce ( seq map-quot reduce-quot -- result )
9 >r [ unclip ] dip [ call ] keep r> compose reduce ; inline
11 : reduce* ( seq quot -- result ) [ ] swap map-reduce ; inline
13 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
15 : higher ( a b quot -- c ) [ compare 0 > ] curry most ; inline
17 : lower ( a b quot -- c ) [ compare 0 < ] curry most ; inline
19 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
21 : longer ( a b -- c ) [ length ] higher ;
23 : shorter ( a b -- c ) [ length ] lower ;
25 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
27 : longest ( seq -- item ) [ longer ] reduce* ;
29 : shortest ( seq -- item ) [ shorter ] reduce* ;
31 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
33 : bigger ( a b -- c ) [ ] higher ;
35 : smaller ( a b -- c ) [ ] lower ;
37 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
39 : biggest ( seq -- item ) [ bigger ] reduce* ;
41 : smallest ( seq -- item ) [ smaller ] reduce* ;
43 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
45 : minmax ( seq -- min max )
46 #! find the min and max of a seq in one pass
47 1/0. -1/0. rot [ tuck max >r min r> ] each ;