#ifndef SRC_SAND_WEDGE_DATA_PATCHFUNCTION_HH
#define SRC_SAND_WEDGE_DATA_PATCHFUNCTION_HH

#include <dune/common/function.hh>
#include <dune/common/fvector.hh>
#include <dune/common/parametertree.hh>

class PatchFunction
    : public Dune::VirtualFunction<Dune::FieldVector<double, DIM>,
                                   Dune::FieldVector<double, 1>> {
private:
  bool static isBetween(double x, double lower, double upper) {
    return lower <= x and x <= upper;
  }

  bool static isClose(double a, double b) {
    return std::abs(a - b) < 1e-14;
  };

  bool insideRegion2(Dune::FieldVector<double, DIM> const &z) const {
    assert(isClose(0, z[1]));
    return isBetween(z[0], _X[0], _Y[0]);
  }

  Dune::FieldVector<double, DIM> const &_X;
  Dune::FieldVector<double, DIM> const &_Y;

  double const _v1;
  double const _v2;

public:
  PatchFunction(double v1, double v2)
      : _X(MyGeometry::X), _Y(MyGeometry::Y), _v1(v1), _v2(v2) {}

  void evaluate(Dune::FieldVector<double, DIM> const &x,
                Dune::FieldVector<double, 1> &y) const {
    y = insideRegion2(x) ? _v2 : _v1;
  }
};
#endif