concat = (...paths) => {
  // Only the last path can be closed, producing a closed path.
  let isClosed = false
  let newpoints = []
  paths.forEach((path, i) => {
    const tmp = toPoints(path).slice()
    if (newpoints.length > 0 && tmp.length > 0 && equals(tmp[0], newpoints[newpoints.length - 1])) tmp.shift()
    if (tmp.length > 0 && isClosed) {
      throw new Error(`Cannot concatenate to a closed path; check the ${i}th path`)
    }
    isClosed = path.isClosed
    newpoints = newpoints.concat(tmp)
  })
  return fromPoints({ closed: isClosed }, newpoints)
}
Concatenate the given paths.

If both contain the same point at the junction, merge it into one.
A concatenation of zero paths is an empty, open path.
A concatenation of one closed path to a series of open paths produces a closed path.
A concatenation of a path to a closed path is an error.
@param {...path2} paths - the paths to concatenate
@returns {path2} a new path
@alias module:modeling/geometries/path2.concat

@example
let newpath = concat(fromPoints({}, [[1, 2]]), fromPoints({}, [[3, 4]]))