Skip to content

Instantly share code, notes, and snippets.

@reborg
Created February 27, 2017 22:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save reborg/0427a81db99e9ca709896cbcb9958261 to your computer and use it in GitHub Desktop.
Save reborg/0427a81db99e9ca709896cbcb9958261 to your computer and use it in GitHub Desktop.
(def pool (delay (java.util.concurrent.ForkJoinPool.)))
(defn fjtask [^Callable f]
(java.util.concurrent.ForkJoinTask/adapt f))
(defn- fjinvoke [f]
(if (java.util.concurrent.ForkJoinTask/inForkJoinPool)
(f)
(.invoke ^java.util.concurrent.ForkJoinPool
@pool ^java.util.concurrent.ForkJoinTask
(fjtask f))))
(defn- fjfork [task]
(.fork ^java.util.concurrent.ForkJoinTask task))
(defn- fjjoin [task]
(.join ^java.util.concurrent.ForkJoinTask task))
(defn pmapv [f v & [n]]
(let [n (or n (+ 2 (.. Runtime getRuntime availableProcessors)))]
(cond
(empty? v) []
(<= (count v) n) (mapv f v)
:else
(let [split (quot (count v) 2)
v1 (subvec v 0 split)
v2 (subvec v split (count v))
fc (fn [child] #(pmapv f child n))]
(fjinvoke
#(let [f1 (fc v1)
t2 (fjtask (fc v2))]
(fjfork t2)
(into (f1) (fjjoin t2))))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment