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

Listas: Nuevos foldeos #129

Closed RaniAgus closed 3 years ago

RaniAgus commented 3 years ago

Agrego las funciones fold1(), get_minimum() y get_maximum() sugeridas acá: https://github.com/sisoputnfrba/so-commons-library/issues/116

Al tratarse de foldeos, hice que tanto minimum como maximum usen un comparador entre dos elementos que devuelva la diferencia entre el primero y el segundo para así poder decidir cuál es el menor o el mayor entre ambos. Esto pensando en el comportamiento de la función strcmp(2).

    /**
    * @NAME: list_get_minimum
    * @DESC: Retorna el minimo de la lista según el comparador
    * El comparador devuelve la diferencia entre el valor del primer 
    * parámetro y el del segundo
    */
    void *list_get_minimum(t_list* self, int (*comparator)(void*, void*));

    /**
    * @NAME: list_get_maximum
    * @DESC: Retorna el maximo de la lista según el comparador
    * El comparador devuelve la diferencia entre el valor del primer 
    * parámetro y el del segundo
    */
    void *list_get_maximum(t_list* self, int (*comparator)(void*, void*));

    /**
     * @NAME: list_fold1
     * @DESC: Devuelve un valor que resulta de aplicar la operacion entre todos los elementos
     * de la lista, tomando al primero como semilla y partiendo desde el segundo (si existe).
     *
     * La funcion 'operation' debe recibir dos valores del tipo de los elementos de la lista.
     */
    void* list_fold1(t_list* self, void* (*operation)(void*, void*));

Estuve revisando otros foldeos que soporta Haskell, pero por ahora ninguno me pareció tan interesante para añadir como estos tres.

gastonprieto commented 3 years ago

@RaniAgus Para lo del maximo, minimo, que opinas de en vez de devolver la resta, te diga cual es el mayor, si bien creo que se pueden hacer optimizaciones aprovechando el delta, creo que sería mas simple de usar y de entender que hace si la operación te dice cual es el mayor por ejemplo.

RaniAgus commented 3 years ago

@gastonprieto Buena idea! Opino lo mismo, queda mucho mejor. Eso sí, ambas funciones quedarían en una línea y harían lo mismo (pasar los parámetros a fold1 y listo), quizás eso sea motivo para descartar ambas y quedarnos directamente con el fold1.

gastonprieto commented 3 years ago

@gastonprieto Buena idea! Opino lo mismo, queda mucho mejor. Eso sí, ambas funciones quedarían en una línea y harían lo mismo (pasar los parámetros a fold1 y listo), quizás eso sea motivo para descartar ambas y quedarnos directamente con el fold1.

No pasa nada, ganamos en expresividad, sino la otra es que en vez de un comparador nos un getter de una característica y la comparción de (>) (<) la hacemos nosotros, pero sería algo así como un max_by_property

RaniAgus commented 3 years ago

No pasa nada, ganamos en expresividad, sino la otra es que en vez de un comparador nos un getter de una característica y la comparción de (>) (<) la hacemos nosotros, pero sería algo así como un max_by_property

Me gustó más la primera.