docs: function Motion (config) {
    this.v = config.v || 0
    this.a = config.a || 0
  
    if (typeof config.t !== 'undefined') {
      this.t = config.t
    }
  
    if (typeof config.s !== 'undefined') {
      this.s = config.s
    }
  
    // derive time from shifting
    if (typeof this.t === 'undefined') {
      if (typeof this.s === 'undefined') {
        this.t = -this.v / this.a
      }
      else {
        const t1 = (Math.sqrt(this.v * this.v + 2 * this.a * this.s) - this.v)
          / this.a
        const t2 = (-Math.sqrt(this.v * this.v + 2 * this.a * this.s) - this.v)
          / this.a
        this.t = Math.min(t1, t2)
      }
    }
  
    // derive shifting from time
    if (typeof this.s === 'undefined') {
      this.s = this.a * this.t * this.t / 2 + this.v * this.t
    }
  }