From: Doug Coleman Date: Mon, 21 Feb 2022 18:18:29 +0000 (-0600) Subject: sequences.extras: add another heap slurping combinator X-Git-Tag: 0.99~1493 X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=commitdiff_plain;h=67e40374416394609c1132bd6c26e4333e735fff sequences.extras: add another heap slurping combinator Fix tests.. --- diff --git a/extra/sequences/extras/extras-tests.factor b/extra/sequences/extras/extras-tests.factor index 8c3335060c..38455fb448 100644 --- a/extra/sequences/extras/extras-tests.factor +++ b/extra/sequences/extras/extras-tests.factor @@ -287,10 +287,10 @@ tools.test vectors vocabs ; { { 1 3 } } [ 1 5 2 10 >array ] unit-test { { 1 3 5 } } [ 1 6 2 10 >array ] unit-test -{ { 2 3 5 } } [ - [ swap [ * ] [ 100 + ] if* ] map-with-previous +{ { 102 306 1530 } } [ + { 2 3 5 } [ swap [ * ] [ 100 + ] if* ] map-with-previous ] unit-test { { } } [ - [ nip ] map-with-previous + { } [ nip ] map-with-previous ] unit-test diff --git a/extra/sequences/extras/extras.factor b/extra/sequences/extras/extras.factor index 9cd86797b8..ae0de0ae73 100644 --- a/extra/sequences/extras/extras.factor +++ b/extra/sequences/extras/extras.factor @@ -491,6 +491,33 @@ PRIVATE> : zero-loop>array ( quot: ( ..a n -- ..a obj ) -- seq ) { } zero-loop>sequence ; inline +: iterate-heap-while ( heap quot1: ( value key -- slurp? ) quot2: ( value key -- obj/f ) -- obj/f loop? ) + pick heap-empty? + [ 3drop f f ] + [ + [ [ heap-peek ] 2dip drop 2keep ] + [ + nip ! ( pop? value key heap quot2 ) + 5roll [ + swap heap-pop* call( value key -- obj/f ) t + ] [ + 4drop f f + ] if + ] 3bi + ] if ; inline + +: slurp-heap-while-map ( heap quot1: ( value key -- slurp? ) quot2: ( value key -- obj/f ) -- seq ) + '[ _ _ _ iterate-heap-while ] loop>array* ; inline + +: heap>pairs ( heap -- pairs ) + [ 2drop t ] [ swap 2array ] slurp-heap-while-map ; + +: map-zip-swap ( quot: ( x -- y ) -- alist ) + '[ _ keep ] map>alist ; inline + +: ?heap-pop-value>array ( heap -- array ) + dup heap-empty? [ drop { } ] [ heap-pop drop 1array ] if ; +