| 
									
										
										
										
											2013-09-06 00:07:50 -04:00
										 |  |  | USING: arrays assocs kernel kernel.private locals math | 
					
						
							| 
									
										
										
										
											2014-01-08 14:49:43 -05:00
										 |  |  | math.order sequences sequences.extras sequences.private sorting ;
 | 
					
						
							| 
									
										
										
										
											2012-08-06 13:59:40 -04:00
										 |  |  | IN: sorting.extras | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : argsort ( seq quot: ( obj1 obj2 -- <=> ) -- sortedseq )
 | 
					
						
							| 
									
										
										
										
											2014-11-08 03:46:30 -05:00
										 |  |  |     [ zip-index ] dip
 | 
					
						
							| 
									
										
										
										
											2012-08-06 13:59:40 -04:00
										 |  |  |     [ [ first-unsafe ] bi@ ] prepose
 | 
					
						
							| 
									
										
										
										
											2012-09-19 13:23:58 -04:00
										 |  |  |     sort [ second-unsafe ] map! ; inline
 | 
					
						
							| 
									
										
										
										
											2013-04-01 21:35:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : map-sort ( ... seq quot: ( ... elt -- ... key ) -- ... sortedseq )
 | 
					
						
							| 
									
										
										
										
											2014-12-05 13:50:32 -05:00
										 |  |  |     [ keep ] curry { } map>assoc
 | 
					
						
							| 
									
										
										
										
											2013-07-24 13:24:13 -04:00
										 |  |  |     [ { array } declare first-unsafe ] sort-with | 
					
						
							|  |  |  |     [ { array } declare second-unsafe ] map ; inline
 | 
					
						
							| 
									
										
										
										
											2013-09-06 00:07:50 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | :: bisect-left ( obj seq -- i )
 | 
					
						
							|  |  |  |     0 seq length [ 2dup < ] [ | 
					
						
							|  |  |  |         2dup + 2/ dup seq nth-unsafe obj before? | 
					
						
							|  |  |  |         [ swap [ nip 1 + ] dip ] [ nip ] if
 | 
					
						
							|  |  |  |     ] while drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :: bisect-right ( obj seq -- i )
 | 
					
						
							|  |  |  |     0 seq length [ 2dup < ] [ | 
					
						
							|  |  |  |         2dup + 2/ dup seq nth-unsafe obj after? | 
					
						
							|  |  |  |         [ nip ] [ swap [ nip 1 + ] dip ] if
 | 
					
						
							|  |  |  |     ] while drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : insort-left ( obj seq -- seq' )
 | 
					
						
							|  |  |  |     [ bisect-left ] 2keep swapd insert-nth ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : insort-right ( obj seq -- seq' )
 | 
					
						
							|  |  |  |     [ bisect-right ] 2keep swapd insert-nth ;
 | 
					
						
							| 
									
										
										
										
											2014-01-08 14:49:43 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : insort-left! ( obj seq -- seq )
 | 
					
						
							|  |  |  |     [ bisect-left ] 2keep swapd [ insert-nth! ] keep ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : insort-right! ( obj seq -- seq )
 | 
					
						
							|  |  |  |     [ bisect-right ] 2keep swapd [ insert-nth! ] keep ;
 |