sisoputnfrba / so-commons-library

TADs de uso comun en aplicaciones desarrolladas en C
http://sisoputnfrba.github.io/so-commons-library/
GNU General Public License v3.0
106 stars 174 forks source link

Nuevas features para list #124

Closed RaniAgus closed 3 years ago

RaniAgus commented 4 years ago

Este PR incluye:

  1. Un fix de un bug con list_sort, que solucioné aplicando lo propuesto acá (https://github.com/sisoputnfrba/so-commons-library/issues/121). Además, cambié el algoritmo de esta función: ahora crea una lista auxiliar, va quitando cada nodo de la lista e insertándolo en forma ordenada en la auxiliar (solo los mueve, no crea nuevos). Al final, el head de la lista original para a ser la lista auxiliar y, de esa forma, se obtiene una lista ordenada. 1.1. Una nueva feature list_add_sorted (más conocido como "insertar ordenado").

  2. Una nueva feature list_remove_and_destroy_all_by_condition (https://github.com/sisoputnfrba/so-commons-library/issues/105)

  3. Nuevas features para foldeos de listas (https://github.com/sisoputnfrba/so-commons-library/issues/116) 3.1. list_fold1 3.2. list_get_min_by 3.3. list_get_max_by

  4. Nueva feature list_zip_with, creo que es una buena idea mostrar una solución que use list_map para que, si alguien quiere hacer un zip with entre 3 listas o más, pueda ver cómo hacerlo. Quizás se podría usar para reconstruir un struct después de serializar: uno crea listas para cada parámetro y esta función serviría para "juntarlos en uno" como se ve en el test. Me pareció copada por eso.

  5. Un refactor en cuanto a los algoritmos de las funciones de listas, en mi opinión no sé si gana tanto en eficiencia, pero sí en cuanto a la lógica usada: la idea es que están las funciones "genéricas" privadas, y que cada función usa esa lógica de diferentes formas:

    • list_find_element sirve para get, replace y find
    • list_remove_element sirve para remove, remove_by_condition y sort
    • list_add_element sirve para add, add_in_index, add_sorted y sort
    • list_add_to_sublist sirve para todas las funciones que crean (o agregan elementos a) una lista diferente de la original (transformados o no).

Creo que pueden ser útiles para el que quiera meterse a codear aún más funciones de listas.

RaniAgus commented 3 years ago

Voy a subdividir este Pull Request en varios para que puedan irlos revisando y aprobando uno por uno.