Estoy usando la biblioteca "Ramda/Fantasy" para crear Monads. Y estoy tratando de combinar IO para obtener elementos del DOM y cambiar su contenido de texto. Pero el problema es que la función que cambia el contenido del elemento necesita tomar dos argumentos, el elemento y el texto que queremos establecer. No sé cómo puedo hacerlo de manera eficiente. Encontré una solución que se ve así:
const getElement = id => IO(() => document.querySelector(id)); const setElementText = element => text => IO(() => element.textcontent = text); getElement('h1').map(setElementText).runIO()('New Title').runIO();¿Hay una mejor manera?
Dos pequeños cambios para ayudar con su ejemplo:
setElementText le permite aplicar parcialmente el valor del texto.chain en lugar del map elimina la necesidad de la segunda llamada runIO . const getElement = id => IO(() => document.querySelector(id)) const setElementText = text => element => IO(() => element.textContent = text) getElement('h1').chain(setElementText('New Title')).runIO()También encontré una segunda solución para usar el método "ap()" que aplica la función (resultante de la acción en esta instancia de IO) al valor resultante de la acción en la instancia de IO dada.
import {IO} from "ramda-fantasy"; const getElement = id => IO(() => document.querySelector(id)) const setElementText = element => text => IO(() => element.textContent = text) const someText = IO(() => 'New Title') const setHeading = getElement('h1').map(setElementText).ap(someText).runIO(); setHeading.runIO(); // It works