Seguimos con concurrencia en Clojure
(defn create-session []
(let [snippets (repeatedly promise)
translations (delay (map translate
(strings->sentences (map deref snippets))))]
(new-session {:snippets snippets :translations translations})))
Seguimos usando una secuencia perezosa infinita de promesas para representar los fragmentos entrantes y un mapa sobre esa secuencia para representar las traducciones, pero ahora ambos están almacenados en una sesión.
A continuación, debemos modificar accept-snippet y get-translation para buscar :snippets o :translations dentro de una sesión:
(defn accept-snippet [session n text]
(deliver (nth (:snippets session) n) text))
(defn get-translation [session n]
@(nth @(:translations session) n))