## Random template-string hacks

This function riffles two strings (i.e. turns `"abc","de"` into `"adbec"`):

    f=(x,y)=>String.raw({raw:x},...y)

Note that this only works when `x` is longer than `y`. How does it work, you ask? `String.raw` is designed to be a template tag, like so:

    String.raw`x: ${x}\ny: ${y}\nx + y: ${x + y}`

This basically calls `String.raw(["x: ", "\ny: ", "\nx + y: ", ""], x, y, x + y)`, though it's not that simple. The template array also has a special `raw` property, which is basically a copy of the array, but with the raw strings. `String.raw(x, ...args)` basically returns `x.raw[0] + args[0] + x.raw[1] + args[1] + x.raw[2] + ...` and so on until `x` runs out of items.

So now that we know how `String.raw` works, we can use it to our advantage:

    f=(x,y)=>String.raw({raw:x},...y)                   // f("abc", "de") => "adbec"
    f=x=>String.raw({raw:x},...[...x].keys())           // f("abc") => "a0b1c"
    f=(x,y)=>String.raw({raw:x},...[...x].fill(y))      // f("abc", " ") => "a b c"

Of course, for that last one, ```f=(x,y)=>x.split``.join(y)``` is way shorter, but you get the idea.

Here are a couple of riffling functions that also work if `x` and `y` are of equal length:

    f=(x,y)=>String.raw({raw:x.match(/.?/g)},...y)
    f=(x,y)=>String.raw({raw:x},...y)+y.slice(-1)  // Only works if x.length == y.length

You can learn more about `String.raw` [on MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#Tagged_template_literals).