I think you can use group-by from sequences.extras. It works similar to map-runs:
{ 1 5 "hello" 2 "world" 3 6 9 "!" } [ integer? ] group-by [ swap [ sum ] [ first ] if ] { } assoc>map . { 6 "hello" 2 "world" 18 "!" } 2016-12-16 11:16 GMT+01:00 Alexander Ilin <ajs...@yandex.ru>: > Hello! > > I was solving this issue, and it got me wondering if there is a better > solution somewhere in the library. Could you check this out? > > I want to find consecutive runs of numbers and replace them with a sum, > while preserving all other objects in the sequence (currently only strings > are in there). For example: > > IN: { 1 5 "hello" 2 "world" 3 6 9 "!" } collapse-numbers > OUT: { 6 "hello" 2 "world" 18 "!" } > > Here's the `collapse-numbers` implementation that I came up with: > > :: collapse-numbers ( seq -- seq' ) > f :> accum! seq [ > accum 2dup [ number? ] both? [ > + accum! f > ] [ > swap accum! > ] if > ] map sift accum suffix ; > > Using a local variable for a side-effect in map feels like cheating, > straight from my imperative programming background. > Is there a way to, maybe, convert numbers into subsequences? > > IN: { 1 5 "hello" 2 "world" 3 6 9 "!" } [ number? ] map-runs > OUT: { { 1 5 } "hello" { 2 } "world" { 3 6 9 } "!" } > > If we had something like `map-runs`, the whole task could be solved in a > more functional way: > > : collapse-numbers ( seq -- seq' ) > [ number? ] map-runs [ dup string? [ sum ] unless ] map ; > > What are your thoughts on this? Do we **have** something like `map-runs`? > Do we **need** it? Should I have used PEGs to parse the sequence? > > ---=====--- > Александр > > ------------------------------------------------------------------------------ > Check out the vibrant tech community on one of the world's most > engaging tech sites, SlashDot.org! http://sdm.link/slashdot > _______________________________________________ > Factor-talk mailing list > Factor-talk@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/factor-talk -- mvh/best regards Björn Lindqvist ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, SlashDot.org! http://sdm.link/slashdot _______________________________________________ Factor-talk mailing list Factor-talk@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/factor-talk