+str #15764: Add concat combinator

do these really need to be different classses? we should probably revisit in a later sprint