docs: def _unpack_fcn(fcn, p0, y, x):
      """ reconfigure fitting fcn so inputs, outputs = flat arrays; hide x """
      if y.shape is not None:
          if p0.shape is not None:
              def nfcn(p, x=x, fcn=fcn, pshape=p0.shape):
                  po = p.reshape(pshape)
                  ans = fcn(po) if x is False else fcn(x, po)
                  if hasattr(ans, 'flat'):
                      return ans.flat
                  else:
                      return numpy.array(ans).flat
          else:
              po = _gvar.BufferDict(p0, buf=numpy.zeros(p0.size, float))
              def nfcn(p, x=x, fcn=fcn, po=po):
                  po.buf = p
                  ans = fcn(po) if x is False else fcn(x, po)
                  if hasattr(ans, 'flat'):
                      return ans.flat
                  else:
                      return numpy.array(ans).flat
      else:
          yo = _gvar.BufferDict(y, buf=y.size*[None])
          if p0.shape is not None:
              def nfcn(p, x=x, fcn=fcn, pshape=p0.shape, yo=yo):
                  po = p.reshape(pshape)
                  fxp = fcn(po) if x is False else fcn(x, po)
                  for k in yo:
                      yo[k] = fxp[k]
                  return yo.flat
          else:
              po = _gvar.BufferDict(p0, buf=numpy.zeros(p0.size, float))
              def nfcn(p, x=x, fcn=fcn, po=po, yo=yo):
                  po.buf = p
                  fxp = fcn(po) if x is False else fcn(x, po)
                  for k in yo:
                      yo[k] = fxp[k]
                  return yo.flat
      return nfcn