| 
									
										
										
										
											2009-02-08 00:04:55 -05:00
										 |  |  | ! Copyright (C) 2007, 2009 Chris Double, Doug Coleman, Eduardo | 
					
						
							| 
									
										
										
										
											2008-11-25 06:55:49 -05:00
										 |  |  | ! Cavazos, Slava Pestov. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2009-10-14 17:50:30 -04:00
										 |  |  | USING: kernel kernel.private sequences sequences.private math | 
					
						
							|  |  |  | combinators macros math.order math.ranges quotations fry effects | 
					
						
							| 
									
										
										
										
											2010-01-31 15:46:46 -05:00
										 |  |  | memoize.private arrays ;
 | 
					
						
							| 
									
										
										
										
											2008-11-25 06:55:49 -05:00
										 |  |  | IN: generalizations | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-25 17:47:47 -05:00
										 |  |  | << | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-08 13:55:52 -04:00
										 |  |  | ALIAS: n*quot (n*quot) | 
					
						
							| 
									
										
										
										
											2008-11-25 17:47:47 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : repeat ( n obj quot -- ) swapd times ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | >> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-08 00:04:55 -05:00
										 |  |  | MACRO: nsum ( n -- )
 | 
					
						
							| 
									
										
										
										
											2009-08-13 20:21:44 -04:00
										 |  |  |     1 - [ + ] n*quot ;
 | 
					
						
							| 
									
										
										
										
											2009-02-08 00:04:55 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-27 22:53:53 -05:00
										 |  |  | MACRO: npick ( n -- )
 | 
					
						
							| 
									
										
										
										
											2009-08-13 20:21:44 -04:00
										 |  |  |     1 - [ dup ] [ '[ _ dip swap ] ] repeat ;
 | 
					
						
							| 
									
										
										
										
											2008-11-25 06:55:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-11 12:03:18 -04:00
										 |  |  | MACRO: nover ( n -- )
 | 
					
						
							| 
									
										
										
										
											2009-06-19 13:58:17 -04:00
										 |  |  |     dup 1 + '[ _ npick ] n*quot ;
 | 
					
						
							| 
									
										
										
										
											2009-06-11 12:03:18 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-25 06:55:49 -05:00
										 |  |  | MACRO: ndup ( n -- )
 | 
					
						
							|  |  |  |     dup '[ _ npick ] n*quot ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-14 17:50:30 -04:00
										 |  |  | MACRO: dupn ( n -- )
 | 
					
						
							|  |  |  |     [ [ drop ] ] | 
					
						
							|  |  |  |     [ 1 - [ dup ] n*quot ] if-zero ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-25 06:55:49 -05:00
										 |  |  | MACRO: nrot ( n -- )
 | 
					
						
							| 
									
										
										
										
											2009-08-13 20:21:44 -04:00
										 |  |  |     1 - [ ] [ '[ _ dip swap ] ] repeat ;
 | 
					
						
							| 
									
										
										
										
											2008-11-25 06:55:49 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | MACRO: -nrot ( n -- )
 | 
					
						
							| 
									
										
										
										
											2009-08-13 20:21:44 -04:00
										 |  |  |     1 - [ ] [ '[ swap _ dip ] ] repeat ;
 | 
					
						
							| 
									
										
										
										
											2008-11-25 06:55:49 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | MACRO: ndrop ( n -- )
 | 
					
						
							|  |  |  |     [ drop ] n*quot ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-25 17:47:47 -05:00
										 |  |  | MACRO: nnip ( n -- )
 | 
					
						
							|  |  |  |     '[ [ _ ndrop ] dip ] ;
 | 
					
						
							| 
									
										
										
										
											2008-11-25 06:55:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-14 17:50:30 -04:00
										 |  |  | MACRO: ndip ( n -- )
 | 
					
						
							|  |  |  |     [ [ dip ] curry ] n*quot [ call ] compose ;
 | 
					
						
							| 
									
										
										
										
											2008-11-25 06:55:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-15 16:04:30 -04:00
										 |  |  | MACRO: nkeep ( n -- )
 | 
					
						
							|  |  |  |     dup '[ [ _ ndup ] dip _ ndip ] ;
 | 
					
						
							| 
									
										
										
										
											2008-11-25 06:55:49 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | MACRO: ncurry ( n -- )
 | 
					
						
							|  |  |  |     [ curry ] n*quot ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MACRO: nwith ( n -- )
 | 
					
						
							|  |  |  |     [ with ] n*quot ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-11 12:03:18 -04:00
										 |  |  | MACRO: nbi ( n -- )
 | 
					
						
							|  |  |  |     '[ [ _ nkeep ] dip call ] ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-09 05:20:20 -05:00
										 |  |  | MACRO: ncleave ( quots n -- )
 | 
					
						
							|  |  |  |     [ '[ _ '[ _ _ nkeep ] ] map [ ] join ] [ '[ _ ndrop ] ] bi
 | 
					
						
							|  |  |  |     compose ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-08 00:04:55 -05:00
										 |  |  | MACRO: nspread ( quots n -- )
 | 
					
						
							|  |  |  |     over empty? [ 2drop [ ] ] [ | 
					
						
							|  |  |  |         [ [ but-last ] dip ] | 
					
						
							| 
									
										
										
										
											2009-05-25 17:38:33 -04:00
										 |  |  |         [ [ last ] dip ] 2bi
 | 
					
						
							| 
									
										
										
										
											2009-02-08 00:04:55 -05:00
										 |  |  |         swap
 | 
					
						
							|  |  |  |         '[ [ _ _ nspread ] _ ndip @ ] | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-14 17:50:30 -04:00
										 |  |  | MACRO: spread* ( n -- )
 | 
					
						
							|  |  |  |     [ [ ] ] [ | 
					
						
							| 
									
										
										
										
											2010-01-31 15:46:46 -05:00
										 |  |  |         [1,b) [ '[ [ [ _ ndip ] curry ] dip compose ] ] map [ ] concat-as
 | 
					
						
							| 
									
										
										
										
											2009-10-14 17:50:30 -04:00
										 |  |  |         [ call ] compose
 | 
					
						
							|  |  |  |     ] if-zero ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-31 15:46:46 -05:00
										 |  |  | MACRO: nspread* ( m n -- )
 | 
					
						
							|  |  |  |     [ drop [ ] ] [ | 
					
						
							|  |  |  |         [ * 0 ] [ drop neg ] 2bi
 | 
					
						
							|  |  |  |         <range> rest >array dup length iota <reversed>
 | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             '[ [ [ _ ndip ] curry ] _ ndip ] | 
					
						
							|  |  |  |         ] 2map dup rest-slice [ [ compose ] compose ] map! drop
 | 
					
						
							|  |  |  |         [ ] concat-as [ call ] compose
 | 
					
						
							|  |  |  |     ] if-zero ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-14 17:50:30 -04:00
										 |  |  | MACRO: cleave* ( n -- )
 | 
					
						
							|  |  |  |     [ [ ] ] | 
					
						
							|  |  |  |     [ 1 - [ [ [ keep ] curry ] dip compose ] n*quot [ call ] compose ]  | 
					
						
							|  |  |  |     if-zero ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-05 17:12:13 -05:00
										 |  |  | : napply ( quot n -- )
 | 
					
						
							|  |  |  |     [ dupn ] [ spread* ] bi ; inline
 | 
					
						
							| 
									
										
										
										
											2008-11-27 22:07:50 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-31 15:46:46 -05:00
										 |  |  | : mnapply ( quot m n -- )
 | 
					
						
							|  |  |  |     [ nip dupn ] [ nspread* ] 2bi ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-05 16:58:00 -05:00
										 |  |  | : apply-curry ( a... quot n -- )
 | 
					
						
							| 
									
										
										
										
											2009-10-14 17:50:30 -04:00
										 |  |  |     [ [curry] ] dip napply ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-05 16:58:00 -05:00
										 |  |  | : cleave-curry ( a quot... n -- )
 | 
					
						
							| 
									
										
										
										
											2009-10-14 17:50:30 -04:00
										 |  |  |     [ [curry] ] swap [ napply ] [ cleave* ] bi ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-05 16:58:00 -05:00
										 |  |  | : spread-curry ( a... quot... n -- )
 | 
					
						
							| 
									
										
										
										
											2009-10-14 17:50:30 -04:00
										 |  |  |     [ [curry] ] swap [ napply ] [ spread* ] bi ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-27 22:07:50 -05:00
										 |  |  | MACRO: mnswap ( m n -- )
 | 
					
						
							| 
									
										
										
										
											2009-08-13 20:21:44 -04:00
										 |  |  |     1 + '[ _ -nrot ] swap '[ _ _ napply ] ;
 | 
					
						
							| 
									
										
										
										
											2009-02-08 00:04:55 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | MACRO: nweave ( n -- )
 | 
					
						
							| 
									
										
										
										
											2009-08-19 10:53:13 -04:00
										 |  |  |     [ dup iota <reversed> [ '[ _ _ mnswap ] ] with map ] keep
 | 
					
						
							| 
									
										
										
										
											2009-02-08 00:04:55 -05:00
										 |  |  |     '[ _ _ ncleave ] ;
 | 
					
						
							| 
									
										
										
										
											2009-01-18 21:26:58 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-11 12:03:18 -04:00
										 |  |  | MACRO: nbi-curry ( n -- )
 | 
					
						
							|  |  |  |     [ bi-curry ] n*quot ;
 |