Adding map-find to core
							parent
							
								
									064bb01cf5
								
							
						
					
					
						commit
						5dc614c9c9
					
				| 
						 | 
				
			
			@ -2,13 +2,6 @@ IN: xmode.utilities.tests
 | 
			
		|||
USING: accessors xmode.utilities tools.test xml xml.data kernel
 | 
			
		||||
strings vectors sequences io.files prettyprint assocs
 | 
			
		||||
unicode.case ;
 | 
			
		||||
[ "hi" 3 ] [
 | 
			
		||||
    { 1 2 3 4 5 6 7 8 } [ H{ { 3 "hi" } } at ] map-find
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
[ f f ] [
 | 
			
		||||
    { 1 2 3 4 5 6 7 8 } [ H{ { 11 "hi" } } at ] map-find
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
TUPLE: company employees type ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,11 +6,6 @@ IN: xmode.utilities
 | 
			
		|||
 | 
			
		||||
: child-tags ( tag -- seq ) children>> [ tag? ] filter ;
 | 
			
		||||
 | 
			
		||||
: map-find ( seq quot -- result elt )
 | 
			
		||||
    [ f ] 2dip
 | 
			
		||||
    '[ nip @ dup ] find
 | 
			
		||||
    [ [ drop f ] unless ] dip ; inline
 | 
			
		||||
 | 
			
		||||
: tag-init-form ( spec -- quot )
 | 
			
		||||
    {
 | 
			
		||||
        { [ dup quotation? ] [ [ object get tag get ] prepose ] }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -397,6 +397,10 @@ HELP: find-last-from
 | 
			
		|||
{ $values { "n" "a starting index" } { "seq" sequence } { "quot" { $quotation "( elt -- ? )" } } { "i" "the index of the first match, or f" } { "elt" "the first matching element, or " { $link f } } }
 | 
			
		||||
{ $description "Applies the quotation to each element of the sequence in reverse order, until it outputs a true value or the start of the sequence is reached. If the quotation yields a true value for some sequence element, the word outputs the element index and the element itself. Otherwise, the word outputs an index of f and " { $link f } " as the element." } ;
 | 
			
		||||
 | 
			
		||||
HELP: map-find
 | 
			
		||||
{ $values { "seq" sequence } { "quot" { $quotation "( elt -- result/f )" } } { "result" "the first non-false result of the quotation" } { "elt" "the first matching element, or " { $link f } } }
 | 
			
		||||
{ $description "Applies the quotation to each element of the sequence, until the quotation outputs a true value. If the quotation ever yields a result which is not " { $link f } ", then the value is output, along with the element of the sequence which yielded this." } ;
 | 
			
		||||
 | 
			
		||||
HELP: any?
 | 
			
		||||
{ $values { "seq" sequence } { "quot" { $quotation "( elt -- ? )" } } { "?" "a boolean" } }
 | 
			
		||||
{ $description "Tests if the sequence contains an element satisfying the predicate, by applying the predicate to each element in turn until a true value is found. If the sequence is empty or if the end of the sequence is reached, outputs " { $link f } "." } ;
 | 
			
		||||
| 
						 | 
				
			
			@ -1455,6 +1459,7 @@ ARTICLE: "sequences-combinators" "Sequence combinators"
 | 
			
		|||
{ $subsection map }
 | 
			
		||||
{ $subsection map-as }
 | 
			
		||||
{ $subsection map-index }
 | 
			
		||||
{ $subsection map-reduce }
 | 
			
		||||
{ $subsection accumulate }
 | 
			
		||||
{ $subsection produce }
 | 
			
		||||
{ $subsection produce-as }
 | 
			
		||||
| 
						 | 
				
			
			@ -1473,6 +1478,7 @@ ARTICLE: "sequence-2combinators" "Pair-wise sequence combinators"
 | 
			
		|||
{ $subsection 2reduce }
 | 
			
		||||
{ $subsection 2map }
 | 
			
		||||
{ $subsection 2map-as }
 | 
			
		||||
{ $subsection 2map-reduce }
 | 
			
		||||
{ $subsection 2all? } ;
 | 
			
		||||
 | 
			
		||||
ARTICLE: "sequence-3combinators" "Triple-wise sequence combinators"
 | 
			
		||||
| 
						 | 
				
			
			@ -1507,7 +1513,8 @@ ARTICLE: "sequences-search" "Searching sequences"
 | 
			
		|||
{ $subsection find }
 | 
			
		||||
{ $subsection find-from }
 | 
			
		||||
{ $subsection find-last }
 | 
			
		||||
{ $subsection find-last-from } ;
 | 
			
		||||
{ $subsection find-last-from }
 | 
			
		||||
{ $subsection map-find } ;
 | 
			
		||||
 | 
			
		||||
ARTICLE: "sequences-trimming" "Trimming sequences"
 | 
			
		||||
"Trimming words:"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
USING: arrays kernel math namespaces sequences kernel.private
 | 
			
		||||
sequences.private strings sbufs tools.test vectors
 | 
			
		||||
sequences.private strings sbufs tools.test vectors assocs
 | 
			
		||||
generic vocabs.loader ;
 | 
			
		||||
IN: sequences.tests
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -274,3 +274,11 @@ M: bogus-hashcode hashcode* 2drop 0 >bignum ;
 | 
			
		|||
[ "asdf" iota ] must-fail
 | 
			
		||||
[ T{ iota { n 10 } } ] [ 10 iota ] unit-test
 | 
			
		||||
[ 0 ] [ 10 iota first ] unit-test
 | 
			
		||||
 | 
			
		||||
[ "hi" 3 ] [
 | 
			
		||||
    { 1 2 3 4 5 6 7 8 } [ H{ { 3 "hi" } } at ] map-find
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
[ f f ] [
 | 
			
		||||
    { 1 2 3 4 5 6 7 8 } [ H{ { 11 "hi" } } at ] map-find
 | 
			
		||||
] unit-test
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -815,6 +815,11 @@ PRIVATE>
 | 
			
		|||
    [ [ 2unclip-slice ] dip [ call ] keep ] dip
 | 
			
		||||
    compose 2reduce ; inline
 | 
			
		||||
 | 
			
		||||
: map-find ( seq quot -- result elt )
 | 
			
		||||
    [ f ] 2dip
 | 
			
		||||
    [ [ nip ] dip call dup ] curry find
 | 
			
		||||
    [ [ drop f ] unless ] dip ; inline
 | 
			
		||||
 | 
			
		||||
: unclip-last-slice ( seq -- butlast-slice last )
 | 
			
		||||
    [ but-last-slice ] [ peek ] bi ; inline
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue