Advertisement
Guest User

Untitled

a guest
Sep 25th, 2017
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.18 KB | None | 0 0
  1. (ns promise-test.core
  2. (:require-macros [cljs.core.async.macros :refer [go]])
  3. (:require [cljs.core.async :refer [<! timeout chan put!]]))
  4.  
  5. (def delay-ms 100)
  6.  
  7. (defn async [n & [f]]
  8. (go
  9. (<! (timeout delay-ms))
  10. ((or f identity) n)))
  11.  
  12. (defn square [n]
  13. (* n n))
  14.  
  15. (defn serial [x]
  16. (go
  17. (let [n (<! (async x))
  18. n-squared (<! (async x square))]
  19. (+ n n-squared))))
  20.  
  21. (defn parallel [x]
  22. (go
  23. (let [n-chan (async x)
  24. n-squared-chan (async x square)
  25. [n n-squared] (<! (cljs.core.async/map vector [n-chan n-squared-chan]))]
  26. (+ n n-squared))))
  27.  
  28. ;; helpers for working with promises in CLJS
  29.  
  30. (defn soon
  31. "Simulate an asynchronous result"
  32. ([v] (soon v identity))
  33. ([v f] (js/Promise. (fn [resolve]
  34. (js/setTimeout #(resolve (f v))
  35. delay-ms)))))
  36.  
  37. (defn promise-to-chan [promise]
  38. (let [channel (chan)]
  39. (.then promise #(put! channel %))
  40. channel))
  41.  
  42. (defn serial2 [x]
  43. (go
  44. (let [n (<! (promise-to-chan (soon x)))
  45. n-squared (<! (promise-to-chan (soon x square)))]
  46. (+ n n-squared))))
  47.  
  48. (defn parallel2 [x]
  49. (go
  50. (let [n-chan (promise-to-chan (soon x))
  51. n-squared-chan (promise-to-chan (soon x square))
  52. [n n-squared] (<! (cljs.core.async/map vector [n-chan n-squared-chan]))]
  53. (+ n n-squared))))
  54.  
  55. (go
  56. (js/console.time "serial")
  57. (js.console.log "serial:" (<! (serial 5)))
  58. (js/console.timeEnd "serial") ; => ~200ms
  59.  
  60. (js/console.time "parallel")
  61. (js.console.log "parallel:" (<! (parallel 5)))
  62. (js/console.timeEnd "parallel") ; => ~100ms
  63.  
  64.  
  65. (js/console.time "serial2")
  66. (js.console.log "serial2:" (<! (serial2 5)))
  67. (js/console.timeEnd "serial2") ; => ~200ms
  68.  
  69. (js/console.time "parallel2")
  70. (js.console.log "parallel2:" (<! (parallel2 5)))
  71. (js/console.timeEnd "parallel2")) ; => ~100ms
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement