| 
									
										
										
										
											2009-04-26 14:31:10 -04:00
										 |  |  | ! Copyright (C) 2009 Slava Pestov. | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2009-04-26 22:24:55 -04:00
										 |  |  | USING: accessors arrays combinators.smart fry functors kernel | 
					
						
							|  |  |  | kernel.private macros sequences combinators sequences.private | 
					
						
							|  |  |  | stack-checker parser math classes.tuple.private ;
 | 
					
						
							| 
									
										
										
										
											2009-04-26 14:31:10 -04:00
										 |  |  | FROM: inverse => undo ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | IN: tuple-arrays | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-26 14:31:10 -04:00
										 |  |  | <PRIVATE
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-26 22:24:55 -04:00
										 |  |  | MACRO: boa-unsafe ( class -- quot ) tuple-layout '[ _ <tuple-boa> ] ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-26 14:31:10 -04:00
										 |  |  | MACRO: infer-in ( class -- quot ) infer in>> '[ _ ] ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-26 22:24:55 -04:00
										 |  |  | : tuple-arity ( class -- quot ) '[ _ boa ] infer-in ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-26 14:31:10 -04:00
										 |  |  | : smart-tuple>array ( tuple class -- array )
 | 
					
						
							|  |  |  |     '[ [ _ boa ] undo ] output>array ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-26 14:31:10 -04:00
										 |  |  | : tuple-prototype ( class -- array )
 | 
					
						
							|  |  |  |     [ new ] [ smart-tuple>array ] bi ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-26 22:24:55 -04:00
										 |  |  | : tuple-slice ( n seq -- slice )
 | 
					
						
							|  |  |  |     [ n>> [ * dup ] keep + ] [ seq>> ] bi { array } declare slice boa ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : read-tuple ( slice class -- tuple )
 | 
					
						
							|  |  |  |     '[ _ boa-unsafe ] input<sequence-unsafe ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MACRO: write-tuple ( class -- quot )
 | 
					
						
							|  |  |  |     [ '[ [ _ boa ] undo ] ] | 
					
						
							|  |  |  |     [ tuple-arity <reversed> [ '[ [ _ ] dip set-nth-unsafe ] ] map '[ _ cleave ] ] | 
					
						
							|  |  |  |     bi '[ _ dip @ ] ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-26 14:31:10 -04:00
										 |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FUNCTOR: define-tuple-array ( CLASS -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CLASS IS ${CLASS} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CLASS-array DEFINES-CLASS ${CLASS}-array | 
					
						
							|  |  |  | CLASS-array? IS ${CLASS-array}? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <CLASS-array> DEFINES <${CLASS}-array> | 
					
						
							|  |  |  | >CLASS-array DEFINES >${CLASS}-array | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WHERE | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-26 22:24:55 -04:00
										 |  |  | TUPLE: CLASS-array | 
					
						
							|  |  |  | { seq array read-only } | 
					
						
							|  |  |  | { n array-capacity read-only } | 
					
						
							|  |  |  | { length array-capacity read-only } ;
 | 
					
						
							| 
									
										
										
										
											2009-04-26 14:31:10 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : <CLASS-array> ( length -- tuple-array )
 | 
					
						
							| 
									
										
										
										
											2009-04-26 22:24:55 -04:00
										 |  |  |     [ \ CLASS [ tuple-prototype <repetition> concat ] [ tuple-arity ] bi ] keep
 | 
					
						
							|  |  |  |     \ CLASS-array boa ; inline
 | 
					
						
							| 
									
										
										
										
											2009-04-26 14:31:10 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-26 22:24:55 -04:00
										 |  |  | M: CLASS-array length length>> ;
 | 
					
						
							| 
									
										
										
										
											2009-04-26 14:31:10 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-26 22:24:55 -04:00
										 |  |  | M: CLASS-array nth-unsafe tuple-slice \ CLASS read-tuple ;
 | 
					
						
							| 
									
										
										
										
											2009-04-26 14:31:10 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-26 22:24:55 -04:00
										 |  |  | M: CLASS-array set-nth-unsafe tuple-slice \ CLASS write-tuple ;
 | 
					
						
							| 
									
										
										
										
											2009-04-26 14:31:10 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-26 22:24:55 -04:00
										 |  |  | M: CLASS-array new-sequence drop <CLASS-array> ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-26 22:24:55 -04:00
										 |  |  | : >CLASS-array ( seq -- tuple-array ) 0 <CLASS-array> clone-like ;
 | 
					
						
							| 
									
										
										
										
											2009-04-26 14:31:10 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-26 22:24:55 -04:00
										 |  |  | M: CLASS-array like drop dup CLASS-array? [ >CLASS-array ] unless ;
 | 
					
						
							| 
									
										
										
										
											2009-04-26 14:31:10 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | INSTANCE: CLASS-array sequence | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-26 14:31:10 -04:00
										 |  |  | ;FUNCTOR | 
					
						
							| 
									
										
										
										
											2008-07-12 17:56:51 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-26 14:31:10 -04:00
										 |  |  | SYNTAX: TUPLE-ARRAY: scan-word define-tuple-array ;
 |