def bipartition_it(elements):
    """ 
    Return all possible 2-set partitions of the given set of elements

    Args:
        - elements (list):
          set of elements to split in two
   
    Outputs: iterator over a tuple of 2 lists.
        Each list is a subset of given elements
    """
    def _bpart_rec(elems, set1, set2):
        if len(set1) + len(set2) < len(elements):
            for sub_s1, sub_s2 in _bpart_rec(elems[1:], set1 + [elems[0]], set2):
                yield sub_s1, sub_s2
            for sub_s1, sub_s2 in _bpart_rec(elems[1:], set1, set2 + [elems[0]]):
                yield sub_s1, sub_s2
        else:
            yield set1, set2
    return _bpart_rec(elements, [], [])