| 
									
										
										
										
											2009-04-05 14:11:35 -04:00
										 |  |  | USING: accessors assocs bson.constants combinators.short-circuit | 
					
						
							|  |  |  | constructors continuations fry kernel mirrors mongodb.tuple.collection | 
					
						
							|  |  |  | mongodb.tuple.state namespaces sequences words bson.writer combinators | 
					
						
							|  |  |  | hashtables linked-assocs ;
 | 
					
						
							| 
									
										
										
										
											2009-04-04 05:10:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | IN: mongodb.tuple.persistent | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-05 14:11:35 -04:00
										 |  |  | SYMBOLS: object-map ;
 | 
					
						
							| 
									
										
										
										
											2009-04-04 05:10:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | GENERIC: tuple>assoc ( tuple -- assoc )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GENERIC: tuple>selector ( tuple -- selector )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DEFER: assoc>tuple | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : mdbinfo>tuple-class ( tuple-info -- class )
 | 
					
						
							| 
									
										
										
										
											2009-04-05 14:11:35 -04:00
										 |  |  |    [ first ] keep second lookup ; inline
 | 
					
						
							| 
									
										
										
										
											2009-04-04 05:10:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : tuple-instance ( tuple-info -- instance )
 | 
					
						
							|  |  |  |     mdbinfo>tuple-class new ; inline  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : prepare-assoc>tuple ( assoc -- tuple keylist mirror assoc )
 | 
					
						
							|  |  |  |    [ tuple-info tuple-instance dup
 | 
					
						
							|  |  |  |      <mirror> [ keys ] keep ] keep swap ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : make-tuple ( assoc -- tuple )
 | 
					
						
							| 
									
										
										
										
											2009-04-04 05:25:38 -04:00
										 |  |  |    prepare-assoc>tuple | 
					
						
							| 
									
										
										
										
											2009-05-03 07:46:37 -04:00
										 |  |  |    '[ dup _ at assoc>tuple swap _ set-at ] each ; inline recursive
 | 
					
						
							| 
									
										
										
										
											2009-04-04 05:10:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : at+ ( value key assoc -- value )
 | 
					
						
							|  |  |  |     2dup key?
 | 
					
						
							|  |  |  |     [ at nip ] [ [ dup ] 2dip set-at ] if ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : data-tuple? ( tuple -- ? )
 | 
					
						
							|  |  |  |     dup tuple?
 | 
					
						
							|  |  |  |     [ assoc? not ] [ drop f ] if  ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-03 07:46:37 -04:00
										 |  |  | : add-storable ( assoc ns toid -- )
 | 
					
						
							|  |  |  |    [ [ H{ } clone ] dip object-map get at+ ] dip
 | 
					
						
							|  |  |  |    swap set-at ; inline
 | 
					
						
							| 
									
										
										
										
											2009-04-04 10:13:56 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : write-field? ( tuple key value -- ? )
 | 
					
						
							| 
									
										
										
										
											2009-04-05 14:11:35 -04:00
										 |  |  |    pick mdb-persistent? [  | 
					
						
							|  |  |  |       { [ [ 2drop ] dip not ] | 
					
						
							|  |  |  |         [ drop transient-slot? ] } 3|| not ] [ 3drop t ] if ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: cond-value value quot ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CONSTRUCTOR: cond-value ( value quot -- cond-value ) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : write-mdb-persistent ( value quot: ( tuple -- assoc ) -- value' )
 | 
					
						
							| 
									
										
										
										
											2009-05-03 07:46:37 -04:00
										 |  |  |    over [ call( tuple -- assoc ) ] dip  | 
					
						
							|  |  |  |    [ [ tuple-collection name>> ] [ >toid ] bi ] keep
 | 
					
						
							| 
									
										
										
										
											2009-04-14 09:14:43 -04:00
										 |  |  |    [ add-storable ] dip
 | 
					
						
							| 
									
										
										
										
											2009-05-03 07:46:37 -04:00
										 |  |  |    [ tuple-collection name>> ] [ id>> ] bi <objref> ; inline
 | 
					
						
							| 
									
										
										
										
											2009-04-05 14:11:35 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : write-field ( value quot: ( tuple -- assoc ) -- value' )
 | 
					
						
							|  |  |  |    <cond-value> { | 
					
						
							|  |  |  |       { [ dup value>> mdb-special-value? ] [ value>> ]  } | 
					
						
							|  |  |  |       { [ dup value>> mdb-persistent? ] | 
					
						
							|  |  |  |         [ [ value>> ] [ quot>> ] bi write-mdb-persistent ] } | 
					
						
							|  |  |  |       { [ dup value>> data-tuple? ] | 
					
						
							|  |  |  |         [ [ value>> ] [ quot>> ] bi (( tuple -- assoc )) call-effect ]  } | 
					
						
							|  |  |  |       { [ dup value>> [ hashtable? ] [ linked-assoc? ] bi or ] | 
					
						
							|  |  |  |         [ [ value>> ] [ quot>> ] bi '[ _ write-field ] assoc-map ] } | 
					
						
							|  |  |  |       [ value>> ] | 
					
						
							|  |  |  |    } cond ; inline recursive
 | 
					
						
							| 
									
										
										
										
											2009-04-04 10:13:56 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : write-tuple-fields ( mirror tuple assoc quot: ( tuple -- assoc ) -- )
 | 
					
						
							| 
									
										
										
										
											2009-04-05 14:11:35 -04:00
										 |  |  |    swap ! m t q q a  | 
					
						
							| 
									
										
										
										
											2009-04-04 10:13:56 -04:00
										 |  |  |    '[ _ 2over write-field? | 
					
						
							| 
									
										
										
										
											2009-04-05 14:11:35 -04:00
										 |  |  |       [ _ write-field swap _ set-at ] | 
					
						
							|  |  |  |       [ 2drop ] if
 | 
					
						
							| 
									
										
										
										
											2009-04-04 05:10:13 -04:00
										 |  |  |    ] assoc-each ;  | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-04 10:13:56 -04:00
										 |  |  | : prepare-assoc ( tuple -- assoc mirror tuple assoc )
 | 
					
						
							|  |  |  |    H{ } clone swap [ <mirror> ] keep pick ; inline
 | 
					
						
							| 
									
										
										
										
											2009-04-04 05:10:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : ensure-mdb-info ( tuple -- tuple )     | 
					
						
							| 
									
										
										
										
											2009-05-03 07:46:37 -04:00
										 |  |  |    dup id>> [ <objid> >>id ] unless ; inline
 | 
					
						
							| 
									
										
										
										
											2009-04-04 05:10:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-05 14:11:35 -04:00
										 |  |  | : with-object-map ( quot: ( -- ) -- store-assoc )
 | 
					
						
							|  |  |  |    [ H{ } clone dup object-map ] dip with-variable ; inline
 | 
					
						
							| 
									
										
										
										
											2009-04-04 05:10:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : (tuple>assoc) ( tuple -- assoc )
 | 
					
						
							|  |  |  |    [ prepare-assoc [ tuple>assoc ] write-tuple-fields ] keep
 | 
					
						
							| 
									
										
										
										
											2009-04-05 14:11:35 -04:00
										 |  |  |    over set-tuple-info ; inline
 | 
					
						
							| 
									
										
										
										
											2009-04-04 05:10:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-05 14:11:35 -04:00
										 |  |  | GENERIC: tuple>storable ( tuple -- storable )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: mdb-persistent tuple>storable ( mdb-persistent -- object-map )
 | 
					
						
							|  |  |  |    '[ _ [ tuple>assoc ] write-mdb-persistent drop ] with-object-map ; inline
 | 
					
						
							| 
									
										
										
										
											2009-04-04 05:10:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: mdb-persistent tuple>assoc ( tuple -- assoc )
 | 
					
						
							|  |  |  |    ensure-mdb-info (tuple>assoc) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: tuple tuple>assoc ( tuple -- assoc )
 | 
					
						
							|  |  |  |    (tuple>assoc) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: tuple tuple>selector ( tuple -- assoc )
 | 
					
						
							|  |  |  |     prepare-assoc [ tuple>selector ] write-tuple-fields ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : assoc>tuple ( assoc -- tuple )
 | 
					
						
							| 
									
										
										
										
											2009-05-03 07:46:37 -04:00
										 |  |  |    dup assoc?
 | 
					
						
							|  |  |  |    [ [ dup tuple-info? | 
					
						
							|  |  |  |        [ make-tuple ] | 
					
						
							|  |  |  |        [ ] if ] [ drop ] recover
 | 
					
						
							|  |  |  |    ] [ ] if ; inline recursive
 | 
					
						
							| 
									
										
										
										
											2009-04-04 05:10:13 -04:00
										 |  |  | 
 |