{ 0 } [ { } [ + ] 0reduce ] unit-test
{ 107 } [ { 100 1 2 4 } [ + ] 0reduce ] unit-test
+{ 0 } [ { 100 1 2 4 } [ * ] 0reduce ] unit-test
+
+{ f } [ { } [ + ] 1reduce ] unit-test
+{ 107 } [ { 100 1 2 4 } [ + ] 1reduce ] unit-test
+{ 800 } [ { 100 1 2 4 } [ * ] 1reduce ] unit-test
+
+{ 800 } [ { 100 1 2 4 } [ * ] 1 reduce-of ] unit-test
+{ 800 { 1 100 100 200 } } [ { 100 1 2 4 } [ * ] 1 accumulate-of ] unit-test
{ { } } [ { } [ + ] 0accumulate ] unit-test
{ { 100 101 103 107 } } [ { 100 1 2 4 } [ + ] 0accumulate ] unit-test
: 0reduce ( seq quot: ( prev elt -- next ) -- result )
[ 0 ] dip reduce ; inline
+: ?unclip ( seq -- rest/f first/f )
+ [ f f ] [ unclip ] if-empty ;
+
+: 1reduce ( seq quot: ( prev elt -- next ) -- result )
+ [ ?unclip ] dip reduce ; inline
+
+: reduce-of ( seq quot: ( prev elt -- next ) identity -- result )
+ swap reduce ; inline
+
+: accumulate-of ( seq quot: ( prev elt -- next ) identity -- result )
+ swap accumulate ; inline
+
<PRIVATE
: push-map-when* ( ..a elt quot: ( ..a elt -- ..b obj ? ) accum -- ..b )