def METHOD_NAME(
        block_structure,
        transformer,
        xblock_field_name,
        merged_field_name,
        default_date,
        func_merge_parents=min,
        func_merge_ancestors=max,
):
    """
    Collects a date xBlock field of name xblock_field_name
    for the given block_structure and transformer.  The date
    value is percolated down the hierarchy of the block_structure
    and stored as a value of merged_field_name in the
    block_structure.
    """
    for block_key in block_structure.topological_traversal():
        parents = block_structure.get_parents(block_key)
        block_date = get_field_on_block(block_structure.get_xblock(block_key), xblock_field_name)
        if not parents:
            # no parents so just use value on block or default
            merged_date_value = block_date or default_date
        else:
            # compute merged value of date from all parents
            merged_all_parents_date = func_merge_parents(
                block_structure.get_transformer_block_field(
                    parent_key, transformer, merged_field_name, default_date,
                )
                for parent_key in parents
            )
            if not block_date:
                # no value on this block so take value from parents
                merged_date_value = merged_all_parents_date
            else:
                # compute merged date of the block and the parent
                merged_date_value = func_merge_ancestors(merged_all_parents_date, block_date)
        block_structure.set_transformer_block_field(
            block_key,
            transformer,
            merged_field_name,
            merged_date_value
        )