factor out string combinator