cursors: finite-stream-cursors can act as containers over [self, end-of-stream)
							parent
							
								
									cd3bffee34
								
							
						
					
					
						commit
						7fe4a2b01f
					
				| 
						 | 
				
			
			@ -116,6 +116,11 @@ M: end-of-stream cursor= eq? ; inline
 | 
			
		|||
M: end-of-stream inc-cursor ; inline
 | 
			
		||||
M: end-of-stream cursor-stream-ended? drop t ; inline
 | 
			
		||||
 | 
			
		||||
INSTANCE: finite-stream-cursor container
 | 
			
		||||
 | 
			
		||||
M: finite-stream-cursor begin-cursor ; inline
 | 
			
		||||
M: finite-stream-cursor end-cursor drop end-of-stream ; inline
 | 
			
		||||
 | 
			
		||||
!
 | 
			
		||||
! basic iterator
 | 
			
		||||
!
 | 
			
		||||
| 
						 | 
				
			
			@ -426,3 +431,58 @@ M: hashtable begin-cursor
 | 
			
		|||
    dup array>> 0 (inc-hashtable-cursor) <hashtable-cursor> ; inline
 | 
			
		||||
M: hashtable end-cursor
 | 
			
		||||
    dup array>> length <hashtable-cursor> ; inline
 | 
			
		||||
 | 
			
		||||
!
 | 
			
		||||
! zip cursor
 | 
			
		||||
!
 | 
			
		||||
 | 
			
		||||
TUPLE: zip-cursor
 | 
			
		||||
    { keys   read-only }
 | 
			
		||||
    { values read-only } ;
 | 
			
		||||
C: <zip-cursor> zip-cursor
 | 
			
		||||
 | 
			
		||||
INSTANCE: zip-cursor forward-cursor
 | 
			
		||||
 | 
			
		||||
M: zip-cursor cursor-compatible? ( cursor cursor -- ? )
 | 
			
		||||
    {
 | 
			
		||||
        [ [ zip-cursor? ] both? ]
 | 
			
		||||
        [ [ keys>> ] bi@ cursor-compatible? ]
 | 
			
		||||
        [ [ values>> ] bi@ cursor-compatible? ]
 | 
			
		||||
    } 2&& ; inline
 | 
			
		||||
 | 
			
		||||
M: zip-cursor cursor-valid? ( cursor -- ? )
 | 
			
		||||
    [ keys>> ] [ values>> ] bi [ cursor-valid? ] both? ; inline
 | 
			
		||||
M: zip-cursor cursor= ( cursor cursor -- ? )
 | 
			
		||||
    {
 | 
			
		||||
        [ [ keys>> ] bi@ cursor= ]
 | 
			
		||||
        [ [ values>> ] bi@ cursor= ]
 | 
			
		||||
    } 2|| ; inline
 | 
			
		||||
 | 
			
		||||
M: zip-cursor cursor-distance-hint ( cursor cursor -- n )
 | 
			
		||||
    [ [ keys>> ] bi@ cursor-distance-hint ]
 | 
			
		||||
    [ [ values>> ] bi@ cursor-distance-hint ] 2bi max ; inline
 | 
			
		||||
 | 
			
		||||
M: zip-cursor inc-cursor ( cursor -- cursor' )
 | 
			
		||||
    [ keys>> inc-cursor ] [ values>> inc-cursor ] bi <zip-cursor> ; inline
 | 
			
		||||
    
 | 
			
		||||
INSTANCE: zip-cursor assoc-cursor
 | 
			
		||||
 | 
			
		||||
M: zip-cursor cursor-key-value
 | 
			
		||||
    [ keys>> cursor-value ] [ values>> cursor-value ] bi ; inline
 | 
			
		||||
 | 
			
		||||
: zip-cursors ( a-begin a-end b-begin b-end -- begin end )
 | 
			
		||||
    [ <zip-cursor> ] bi-curry@ bi* ; inline
 | 
			
		||||
 | 
			
		||||
: 2all ( a b -- begin end )
 | 
			
		||||
    [ all ] bi@ zip-cursors ; inline
 | 
			
		||||
 | 
			
		||||
: 2all- ( a b quot -- begin end quot )
 | 
			
		||||
    [ 2all ] dip ; inline
 | 
			
		||||
 | 
			
		||||
ALIAS: -2container- assoc ; inline
 | 
			
		||||
 | 
			
		||||
: 2container- ( a b quot -- begin end quot' )
 | 
			
		||||
    2all- -2container- ; inline
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue