from GEODE.signal import curry
from numpy import vectorize
import pandas

@curry
def toStrKey(areParagraphs, row):
    key = "{work}_{volume:02d}_{article:04d}"
    if areParagraphs:
        key += "_{paragraph:04d}"
    return key.format(**row)

def forPanda(data, f):
    return vectorize(lambda i: f(data.iloc[i]))

def toTSV(filePath, data, sortBy='toStrKey'):
    if type(data) != pandas.DataFrame:
        data = pandas.DataFrame(data)
    if sortBy == 'toStrKey':
        sortBy = toStrKey('paragraph' in data)
    if sortBy is None:
        sortedData = data
    else:
        sortedData = data.sort_index(key=forPanda(data, sortBy))
    sortedData.to_csv(filePath, sep='\t', index=False)

def fromTSV(filePath):
    return pandas.read_csv(filePath, sep='\t')