Return the restriction of first interval by the second.

        Args:

        - inter0, inter1 (tuple of Feature): intervals

        Return(tuple of Feature): the resulting interval
        - conflict(str): if a property hasn't compatible values/constrains, do:
           - ``"error"``: raise exception.
           - ``"ignore"``: return None.
           - ``"me"``: return finter0.
           - ``"other"``: return finter1.

def _applyInter(finter0, finter1, conflict="ignore"):
        """
        Return the restriction of first interval by the second.

        Args:

        - inter0, inter1 (tuple of Feature): intervals

        Return(tuple of Feature): the resulting interval
        - conflict(str): if a property hasn't compatible values/constrains, do:
           - ``"error"``: raise exception.
           - ``"ignore"``: return None.
           - ``"me"``: return finter0.
           - ``"other"``: return finter1.
        """

        OPTIONS = ["error", "ignore", "me", "other"]
        assert conflict in OPTIONS, "Invalid value in `conflict`."

        # Compute the comparison of the interval extremes
        min_int = -2**63
        # Remember, None <= number and None <= None are True, but number <= None is False.
        inter0 = tuple([f.getValue() if f else min_int for f in finter0])
        inter1 = tuple([f.getValue() if f else min_int for f in finter1])
        le00 = inter0[0] <= inter1[0]                           # finter0[0] <= finter1[0]
        le01 = inter1[1] == min_int or inter0[0] <= inter1[1]   # finter0[0] <= finter1[1]
        le11 = inter1[1] == min_int or (inter0[1] != min_int and inter0[1] <= inter1[1])  # finter0[1] <= finter1[1]
        ge00 = not le00 or inter0[0] == inter1[0]               # finter0[0] >= finter1[0]
        ge10 = inter0[1] == min_int or inter0[1] >= inter1[0]   # finter0[1] >= finter1[0]

        # print "\n".join("%s: %s" % (s, v) for v, s in [
        #    (le00, "finter0[0] <= finter1[0]"),
        #    (le01, "finter0[0] <= finter1[1]"),
        #    (le11, "finter0[1] <= finter1[1]"),
        #    (ge00, "finter0[0] >= finter1[0]"),
        #    (ge10, "finter0[1] >= finter1[0]") ])

        # First interval is (  ), second interval is [  ]
        if le00 and ge10 and le11:                       # ( [ ) ] chain first-second
            return finter1[0], finter0[1]
        elif le00 and ge10 and not le11:                 # ( [ ] )  second is inside first
            return finter1
        elif ge00 and le01 and le11:                     # [ ( ) ] first is inside second
            return finter0
        elif ge00 and le01 and not le11:                 # [ ( ] ) chain second-first
            return finter0[0], finter1[1]
        elif conflict == "me":
            return finter0
        elif conflict == "other":
            return finter1
        elif conflict == "error":
            raise Exception("Disjoint intervals!")
        return None