nb: I believe it's useless to check for len(values)