}
{ $description "Count the number of values from the end of " { $snippet "seq" } " that return a truthy value when passed into " { $snippet "quot" } "." } ;
+HELP: count=
+{ $values
+ { "seq" sequence } { "quot" quotation } { "n" integer }
+ { "?" boolean }
+}
+{ $description "Returns " { $link t } " if the sequence has exactly " { $snippet "n" } " elements where " { $snippet "quot" } " returns true, otherwise returns " { $link f } "." } ;
+
+
HELP: cut-when
{ $values
{ "seq" sequence } { "quot" quotation }
{ 2 } [ { 1 2 3 4 } [ 2 > ] count-tail ] unit-test
{ 4 } [ { 1 2 3 4 } [ 5 < ] count-tail ] unit-test
+{ t } [ { 1 2 3 4 } [ 5 > ] 0 count= ] unit-test
+{ f } [ { 1 2 3 4 } [ 5 > ] 1 count= ] unit-test
+{ 1 t } [ 1 { 1 1 3 4 } [ dupd = ] 2 count= ] unit-test
+{ 1 f } [ 1 { 1 1 3 4 } [ dupd = ] 3 count= ] unit-test
+{ 4 t } [ 0 { 1 1 3 4 } [ [ 1 + dup ] dip = ] 3 count= ] unit-test
+
{ SBUF" aco" SBUF" ftr" } [ SBUF" factor" dup [ even? ] extract! ] unit-test
{ 25 5 1 } [ { 4 5 6 } [ sq ] [ 20 > ] find-pred ] unit-test
[ not ] compose [ find-last drop ] keepd
length swap [ - 1 - ] when* ; inline
+: count= ( ... seq quot: ( ... elt -- ... ? ) n -- ... ? )
+ [ 0 ] 3dip [
+ '[ swap _ dip swap [ 1 + ] when dup _ >= ] find 2drop
+ ] keep = ; inline
+
:: shorten* ( vector n -- seq )
vector n tail
n vector shorten ;