Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

List: Iterator replace #194

Merged
merged 12 commits into from
Jan 15, 2025
Merged

List: Iterator replace #194

merged 12 commits into from
Jan 15, 2025

Conversation

RaniAgus
Copy link
Contributor

@RaniAgus RaniAgus commented Dec 28, 2024

Bueno resulta que hace unos meses arranqué por implementar un list_iterator_replace() y terminé reescribiendo toda la implementación de listas usando el iterador 😅

La verdad que no me había gustado cómo había quedado la implementación actual: la lógica para recorrerla está en cada función por lo que es complicada de leer y explicar (y aparte tiene nested functions, lo cual en Alpine Linux trae problemas). Ahora si quisiera mostrarle a un alumno "mirá, así funciona" creo que es más sencillo:

void *list_replace(t_list *self, int index, void *data) {
	t_list_iterator self_iterator = list_iterator_init(self);
	list_iterator_advance_to_index(&self_iterator, index);
	void *old_data = list_iterator_next(&self_iterator);
	list_iterator_replace(&self_iterator, data);
	return old_data;
}
  1. Me guardo todo lo que necesito para iterar
  2. Voy avanzando el iterador hasta el índice
  3. Reemplazo el puntero actual con el nuevo y lo devuelvo
void *list_replace_by_condition(t_list* self, bool(*condition)(void*), void* element) {
	t_list_iterator self_iterator = list_iterator_init(self);
	if (list_iterator_advance_to_condition(&self_iterator, condition)) {
		void *old_data = list_iterator_next(&self_iterator);
		list_iterator_replace(&self_iterator, element);
		return old_data;
	}
	return NULL;
}
  1. Me guardo todo lo que necesito para iterar
  2. Voy avanzando el puntero hasta que se cumpla la condición
  3. Si se cumple, reemplazo el puntero actual con el nuevo y lo devuelvo
  4. Si no se cumple, devuelvo NULL

Lo piola es que estas abstracciones ahora se usan tanto para buscar, agregar, reemplazar y quitar elementos en la lista.

@RaniAgus RaniAgus force-pushed the feat/iterator-replace branch from 2085111 to 70bcc28 Compare December 28, 2024 18:09
@iago64
Copy link

iago64 commented Dec 30, 2024

Me copa la nueva abstraccion, me parece que es mas legible para el alumno promedio.

@RaniAgus RaniAgus requested a review from iago64 January 8, 2025 15:29
@iago64
Copy link

iago64 commented Jan 13, 2025

Vengo medio lento con estos temas, seguramente en la semana me ponga a revisar a detalle el PR

@RaniAgus RaniAgus merged commit f7906d2 into master Jan 15, 2025
1 check passed
@RaniAgus RaniAgus deleted the feat/iterator-replace branch January 15, 2025 01:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants