From 67e40374416394609c1132bd6c26e4333e735fff Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Mon, 21 Feb 2022 12:18:29 -0600 Subject: [PATCH] sequences.extras: add another heap slurping combinator Fix tests.. --- extra/sequences/extras/extras-tests.factor | 6 ++--- extra/sequences/extras/extras.factor | 27 ++++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) 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 ; +