code: def slice(self, point, datafunc=None):
          
          hitlist = set(iv for iv in self.at(point) if iv.begin < point)
          insertions = set()
          if datafunc:
              for iv in hitlist:
                  insertions.add(Interval(iv.begin, point, datafunc(iv, True)))
                  insertions.add(Interval(point, iv.end, datafunc(iv, False)))
          else:
              for iv in hitlist:
                  insertions.add(Interval(iv.begin, point, iv.data))
                  insertions.add(Interval(point, iv.end, iv.data))
          self.difference_update(hitlist)
          self.update(insertions)
docs: Split Intervals that overlap point into two new Intervals. if
          specified, uses datafunc(interval, islower=True/False) to
          set the data field of the new Intervals.
          :param point: where to slice
          :param datafunc(interval, isupper): callable returning a new
          value for the interval's data field