def process(
        records,
        parse_record=None,
        include_record=None,
        transform_record=None,
):
    """
    Create a pipeline that optionally parses, filters, and transforms
    the given records.  Return an iterable of records.

    records: Iterable<list<str>>
    parse_record: function(list<str>)->list<object>
        Function to convert the text fields of each record into usable
        values.
    include_record: function(list<object>)->bool
        Predicate that returns whether a record should be included or
        discarded.  Applied after parsing a record.
    transform_record: function(list<object>)->list<object>
        Function to transform a record before it is converted into an
        event.  Applied after including / discarding records.
    """
    # Parse records if requested
    if parse_record is not None:
        records = map(parse_record, records)
    # Filter records if requested
    if include_record is not None:
        records = filter(include_record, records)
    # Transform records if requested
    if transform_record is not None:
        records = map(transform_record, records)
    return records