def parse_description(description):
    """Parse a description of a flow.

    Parameters
    ----------
    description : str
        a set of lines desc

    Returns
    -------
    nodes : dict
        each key is a node name
        each value is a 2-tuple containing
        up to two values flowing through
        the node
    outputs : dict
        each key is an output name
        each value is the tuple of values
        at that output name
    edges : dict
        each key is a node name
        each value is a 2-tuple of 2-tuples:
        
            ((low_dictionary, low_node_name),
             (high_dictionary, high_node_name))

        the low dictionary and low node name pair denotes
        where the low value in the node named in the key
        goes, while the high dictionary and high node name
        specify where the high value goes
    """
    nodes = dict()
    outputs = dict()
    edges = dict()
    for line in description:
        components = line.strip().split()
        if not len(components): continue
        sentinel = components[0]
        if sentinel == 'value':
            _, value, _, _, _, node_name = components
            node = nodes.get(node_name, tuple())
            nodes[node_name] = node + (value, )
        else:
            (_, node_name, _, _, _, low_dictionary_name, low_node_name,
             _, _, _, high_dictionary_name, high_node_name) = components
            low_dictionary = \
                nodes if low_dictionary_name == 'bot' else outputs
            high_dictionary = \
                nodes if high_dictionary_name == 'bot' else outputs
            edges[node_name] = ((low_dictionary, low_node_name),
                                (high_dictionary, high_node_name))
    return nodes, outputs, edges