Me gustaría comenzar a jugar con ClojureScript, pero estoy desconcertado sobre algunos puntos. Mi problema es cuál es una buena manera de lidiar con los cambios de estado derivados de la interacción del usuario, cuando intenta trabajar funcionalmente.
Déjame darte un par de ejemplos. Tengo en mente las aplicaciones que se ejecutan en el navegador, pero creo que el problema es más general. Por supuesto, algo va a cambiar, el DOM al menos. Pero me gustaría saber cómo organizar el resto del código para trabajar con estructuras de datos inmutables.
1) Di que quiero adjuntar algunos eventos a algún objeto DOM. Esto no es difícil de hacer de una manera principalmente funcional: cuando crea el nodo, lo adjunta un mapa hash con los diversos controladores de eventos. Pero considere el caso en el que está utilizando la delegación de eventos. Luego, cuando cree un nuevo nodo, puede adjuntar un controlador de eventos a algún nodo principal que probablemente ya exista. Por lo tanto, tendría que cambiar el hash asociado al nodo ya existente.
2) Digamos que estoy diseñando un módulo de autocompletar para un campo de entrada. Cada vez que el usuario presiona una tecla, puedo hacer una llamada a un servidor para obtener las sugerencias. Esto es facil. Pero ahora supongamos que quiero optimizarlo un poco. Si sé que todos los resultados coinciden, foo
no tiene sentido volver a preguntar por todos los resultados foobar
; Solo puedo filtrar el primero. Entonces necesito construir algún tipo de caché. Este caché se actualizará cada vez que el usuario inserte una nueva palabra que no sea un superconjunto de las palabras ingresadas previamente. Nuevamente: ¿cómo modelo el caché? La forma más razonable parece ser un mapa hash que asigna palabras a resultados, pero debe ser mutable.
¿Puede sugerir algunos patrones que faciliten la incorporación de cambios debido a la interacción del usuario en un diseño funcional?