Skip to content

Commit 6187e3c

Browse files
authored
Merge pull request #96 from brandoncorrea/master
Add support for Clojure CLR
2 parents 54f45ab + ebac1a4 commit 6187e3c

5 files changed

Lines changed: 111 additions & 60 deletions

File tree

.github/workflows/test.yml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@ jobs:
1313
distribution: 'zulu'
1414
java-version: '8'
1515

16+
- name: Prepare dotnet
17+
uses: xt0rted/[email protected]
18+
19+
- name: Prepare Clojure CLR
20+
run: |
21+
dotnet tool install --global Clojure.Main --version 1.12.0-alpha10
22+
dotnet tool install --global Clojure.Cljr --version 0.1.0-alpha4
23+
1624
- name: Install clojure tools
1725
uses: DeLaGuardo/[email protected]
1826
with:
@@ -25,5 +33,8 @@ jobs:
2533
key: cljdeps-${{ hashFiles('project.clj') }}
2634
restore-keys: cljdeps-
2735

28-
- name: Run tests
36+
- name: Run clj and cljs tests
2937
run: lein test-all
38+
39+
- name: Run cljr tests
40+
run: cljr -X:test

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ Or to your Leiningen project file:
1919

2020
[dev.weavejester/medley "1.9.0"]
2121

22+
Or to your deps-clr.edn file:
23+
24+
io.github.weavejester/medley {:git/tag "FIXME" :git/sha "FIXME"}
25+
2226
## Documentation
2327

2428
* [API Docs](http://weavejester.github.io/medley/medley.core.html)

deps-clr.edn

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{:paths ["src"]
2+
:aliases
3+
{:test {:extra-paths ["test"]
4+
:extra-deps {io.github.dmiller/test-runner {:git/tag "v0.5.1clr" :git/sha "814e06f"}}
5+
:exec-fn cognitect.test-runner.api/test
6+
:exec-args {:dirs ["test"]}}}}

src/medley/core.cljc

Lines changed: 55 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@
3838
(dissoc-in m ks))))
3939

4040
(defn- editable? [coll]
41-
#?(:clj (instance? clojure.lang.IEditableCollection coll)
42-
:cljs (satisfies? cljs.core/IEditableCollection coll)))
41+
#?(:cljs (satisfies? cljs.core/IEditableCollection coll)
42+
:default (instance? clojure.lang.IEditableCollection coll)))
4343

4444
(defn- assoc-some-transient! [m k v]
4545
(if (nil? v) m (assoc! m k v)))
@@ -102,8 +102,8 @@
102102
(defn map-entry
103103
"Create a map entry for a key and value pair."
104104
[k v]
105-
#?(:clj (clojure.lang.MapEntry. k v)
106-
:cljs (cljs.core/MapEntry. k v nil)))
105+
#?(:cljs (cljs.core/MapEntry. k v nil)
106+
:default (clojure.lang.MapEntry. k v)))
107107

108108
(defn map-kv
109109
"Maps a function over the key/value pairs of an associative collection. Expects
@@ -184,21 +184,21 @@
184184

185185
(defn queue
186186
"Creates an empty persistent queue, or one populated with a collection."
187-
([] #?(:clj clojure.lang.PersistentQueue/EMPTY
188-
:cljs cljs.core/PersistentQueue.EMPTY))
187+
([] #?(:cljs cljs.core/PersistentQueue.EMPTY
188+
:default clojure.lang.PersistentQueue/EMPTY))
189189
([coll] (into (queue) coll)))
190190

191191
(defn queue?
192192
"Returns true if x implements clojure.lang.PersistentQueue."
193193
[x]
194-
(instance? #?(:clj clojure.lang.PersistentQueue
195-
:cljs cljs.core/PersistentQueue) x))
194+
(instance? #?(:cljs cljs.core/PersistentQueue
195+
:default clojure.lang.PersistentQueue) x))
196196

197197
(defn boolean?
198198
"Returns true if x is a boolean."
199199
[x]
200-
#?(:clj (instance? Boolean x)
201-
:cljs (or (true? x) (false? x))))
200+
#?(:cljs (or (true? x) (false? x))
201+
:default (instance? Boolean x)))
202202

203203
(defn least
204204
"Return the least argument (as defined by the compare function) in O(n) time."
@@ -322,12 +322,14 @@
322322
(persistent!
323323
(reduce (fn [m v]
324324
(let [k (keyf v)]
325-
(assoc! m k #?(:clj (if-let [kv (find m k)]
326-
(collatef (val kv) v)
327-
(initf v))
328-
:cljs (if (contains? m k)
329-
(collatef (get m k) v)
330-
(initf v))))))
325+
(assoc! m k #?(:cljs
326+
(if (contains? m k)
327+
(collatef (get m k) v)
328+
(initf v))
329+
:default
330+
(if-let [kv (find m k)]
331+
(collatef (val kv) v)
332+
(initf v))))))
331333
(transient {})
332334
coll))))
333335

@@ -453,27 +455,31 @@
453455
{:added "1.7.0"}
454456
([pred]
455457
(fn [rf]
456-
(let [part #?(:clj (java.util.ArrayList.) :cljs (array-list))
458+
(let [part #?(:clj (java.util.ArrayList.)
459+
:cljr (System.Collections.ArrayList.)
460+
:cljs (array-list))
457461
prev (volatile! ::none)]
458462
(fn
459463
([] (rf))
460464
([result]
461-
(rf (if (.isEmpty part)
465+
(rf (if #?(:cljr (zero? (.-Count part))
466+
:default (.isEmpty part))
462467
result
463-
(let [v (vec (.toArray part))]
464-
(.clear part)
468+
(let [v (vec (#?(:cljr .ToArray :default .toArray) part))]
469+
(#?(:cljr .Clear :default .clear) part)
465470
(unreduced (rf result v))))))
466471
([result input]
467472
(let [p @prev]
468473
(vreset! prev input)
469-
(if (or (#?(:clj identical? :cljs keyword-identical?) p ::none)
474+
(if (or (#?(:cljs keyword-identical? :default identical?) p ::none)
470475
(not (pred p input)))
471-
(do (.add part input) result)
472-
(let [v (vec (.toArray part))]
473-
(.clear part)
476+
(do (#?(:cljr .Add :default .add) part input)
477+
result)
478+
(let [v (vec (#?(:cljr .ToArray :default .toArray) part))]
479+
(#?(:cljr .Clear :default .clear) part)
474480
(let [ret (rf result v)]
475481
(when-not (reduced? ret)
476-
(.add part input))
482+
(#?(:cljr .Add :default .add) part input))
477483
ret)))))))))
478484
([pred coll]
479485
(lazy-seq
@@ -630,14 +636,16 @@
630636
This function therefore acts like an atomic `deref` then `swap!`."
631637
{:arglists '([atom f & args])}
632638
([atom f]
633-
#?(:clj (loop []
634-
(let [value @atom]
635-
(if (compare-and-set! atom value (f value))
636-
value
637-
(recur))))
638-
:cljs (let [value @atom]
639-
(reset! atom (f value))
640-
value)))
639+
#?(:cljs
640+
(let [value @atom]
641+
(reset! atom (f value))
642+
value)
643+
:default
644+
(loop []
645+
(let [value @atom]
646+
(if (compare-and-set! atom value (f value))
647+
value
648+
(recur))))))
641649
([atom f & args]
642650
(deref-swap! atom #(apply f % args))))
643651

@@ -653,6 +661,7 @@
653661
Clojure as well as ClojureScript."
654662
[ex]
655663
#?(:clj (when (instance? Throwable ex) (.getMessage ^Throwable ex))
664+
:cljr (when (instance? Exception ex) (.-Message ^Exception ex))
656665
:cljs (cljs.core/ex-message ex)))
657666

658667
(defn ex-cause
@@ -661,40 +670,49 @@
661670
Clojure as well as ClojureScript."
662671
[ex]
663672
#?(:clj (when (instance? Throwable ex) (.getCause ^Throwable ex))
673+
:cljr (when (instance? Exception ex) (.-InnerException ^Exception ex))
664674
:cljs (cljs.core/ex-cause ex)))
665675

666676
(defn uuid?
667677
"Returns true if the value is a UUID."
668678
[x]
669-
(instance? #?(:clj java.util.UUID :cljs cljs.core/UUID) x))
679+
(instance? #?(:clj java.util.UUID
680+
:cljr System.Guid
681+
:cljs cljs.core/UUID) x))
670682

671683
(defn uuid
672684
"Returns a UUID generated from the supplied string. Same as `cljs.core/uuid`
673685
in ClojureScript, while in Clojure it returns a `java.util.UUID` object."
674686
[s]
675687
#?(:clj (java.util.UUID/fromString s)
688+
:cljr (System.Guid. s)
676689
:cljs (cljs.core/uuid s)))
677690

678691
(defn random-uuid
679692
"Generates a new random UUID. Same as `cljs.core/random-uuid` except it works
680693
for Clojure as well as ClojureScript."
681694
[]
682695
#?(:clj (java.util.UUID/randomUUID)
696+
:cljr (System.Guid/NewGuid)
683697
:cljs (cljs.core/random-uuid)))
684698

685699
(defn regexp?
686700
"Returns true if the value is a regular expression."
687701
{:added "1.4.0"}
688702
[x]
689-
(instance? #?(:clj java.util.regex.Pattern :cljs js/RegExp) x))
703+
(instance? #?(:clj java.util.regex.Pattern
704+
:cljr System.Text.RegularExpressions.Regex
705+
:cljs js/RegExp) x))
690706

691707
(defn index-of
692708
"Returns the index of the first occurrence of the item in the sequential
693709
collection coll, or nil if not found."
694710
{:added "1.9.0"}
695-
[^java.util.List coll item]
711+
#?(:clj [^java.util.List coll item]
712+
:cljr [^System.Collections.IEnumerable coll item]
713+
:default [coll item])
696714
(when (some? coll)
697-
(let [index (.indexOf coll item)]
715+
(let [index (#?(:cljr .IndexOf :default .indexOf) coll item)]
698716
(when-not (neg? index) index))))
699717

700718
(defn find-in

test/medley/core_test.cljc

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
(ns medley.core-test
2-
#?(:clj (:import [clojure.lang ArityException]))
3-
(:require #?(:clj [clojure.test :refer :all]
4-
:cljs [cljs.test :refer-macros [deftest is testing]])
2+
#?@(:cljs []
3+
:default [(:import [clojure.lang ArityException])])
4+
(:require #?(:cljs [cljs.test :refer-macros [deftest is testing]]
5+
:default [clojure.test :refer :all])
56
[medley.core :as m]))
67

78
(deftest test-find-first
@@ -162,17 +163,17 @@
162163

163164
(deftest test-queue
164165
(testing "empty"
165-
#?(:clj (is (instance? clojure.lang.PersistentQueue (m/queue)))
166-
:cljs (is (instance? cljs.core.PersistentQueue (m/queue))))
166+
#?(:cljs (is (instance? cljs.core.PersistentQueue (m/queue)))
167+
:default (is (instance? clojure.lang.PersistentQueue (m/queue))))
167168
(is (empty? (m/queue))))
168169
(testing "not empty"
169-
#?(:clj (is (instance? clojure.lang.PersistentQueue (m/queue [1 2 3])))
170-
:cljs (is (instance? cljs.core.PersistentQueue (m/queue [1 2 3]))))
170+
#?(:cljs (is (instance? cljs.core.PersistentQueue (m/queue [1 2 3])))
171+
:default (is (instance? clojure.lang.PersistentQueue (m/queue [1 2 3]))))
171172
(is (= (first (m/queue [1 2 3])) 1))))
172173

173174
(deftest test-queue?
174-
#?(:clj (is (m/queue? clojure.lang.PersistentQueue/EMPTY))
175-
:cljs (is (m/queue? cljs.core.PersistentQueue.EMPTY)))
175+
#?(:cljs (is (m/queue? cljs.core.PersistentQueue.EMPTY))
176+
:default (is (m/queue? clojure.lang.PersistentQueue/EMPTY)))
176177
(is (not (m/queue? []))))
177178

178179
(deftest test-boolean?
@@ -241,9 +242,11 @@
241242
(is (= (m/mapply foo 0 {:baz 1}) [0 1]))
242243
(is (= (m/mapply foo 0 {:spam 1}) [0 nil]))
243244
(is (= (m/mapply foo 0 nil) [0 nil]))
244-
#?@(:clj [(is (thrown? ArityException (m/mapply foo {})))
245-
(is (thrown? IllegalArgumentException (m/mapply foo 0)))]
246-
:cljs [(is (thrown? js/Error (m/mapply foo 0)))])))
245+
(is (thrown? #?(:clj IllegalArgumentException
246+
:cljr ArgumentException
247+
:cljs js/Error) (m/mapply foo 0)))
248+
#?(:cljs (is (= (m/mapply foo {}) [nil nil]))
249+
:default (is (thrown? ArityException (m/mapply foo {}))))))
247250

248251
(deftest test-collate-by
249252
(is (= (m/collate-by identity conj vector [1 2 2 3 3])
@@ -473,10 +476,11 @@
473476
(is (= (m/abs 2) 2))
474477
(is (= (m/abs -2.1) 2.1))
475478
(is (= (m/abs 1.8) 1.8))
476-
#?@(:clj [(is (= (m/abs -1/3) 1/3))
477-
(is (= (m/abs 1/2) 1/2))
478-
(is (= (m/abs 3N) 3N))
479-
(is (= (m/abs -4N) 4N))]))
479+
#?@(:cljs []
480+
:default [(is (= (m/abs -1/3) 1/3))
481+
(is (= (m/abs 1/2) 1/2))
482+
(is (= (m/abs 3N) 3N))
483+
(is (= (m/abs -4N) 4N))]))
480484

481485
(deftest test-deref-swap!
482486
(let [a (atom 0)]
@@ -494,12 +498,14 @@
494498

495499
(deftest test-ex-message
496500
(is (= (m/ex-message (ex-info "foo" {})) "foo"))
497-
(is (= (m/ex-message (new #?(:clj Exception :cljs js/Error) "bar")) "bar")))
501+
(let [ex (new #?(:cljs js/Error :default Exception) "bar")]
502+
(is (= (m/ex-message ex) "bar"))))
498503

499504
(deftest test-ex-cause
500-
(let [cause (new #?(:clj Exception :cljs js/Error) "foo")]
505+
(let [cause (new #?(:cljs js/Error :default Exception) "foo")]
501506
(is (= (m/ex-cause (ex-info "foo" {} cause)) cause))
502-
#?(:clj (is (= (m/ex-cause (Exception. "foo" cause)) cause)))))
507+
#?@(:cljs []
508+
:default [(is (= (m/ex-cause (Exception. "foo" cause)) cause))])))
503509

504510
(deftest test-uuid?
505511
(let [x #uuid "d1a4adfa-d9cf-4aa5-9f05-a15365d1bfa6"]
@@ -510,14 +516,20 @@
510516

511517
(deftest test-uuid
512518
(let [x (m/uuid "d1a4adfa-d9cf-4aa5-9f05-a15365d1bfa6")]
513-
(is (instance? #?(:clj java.util.UUID :cljs cljs.core.UUID) x))
519+
(is (instance? #?(:clj java.util.UUID
520+
:cljr System.Guid
521+
:cljs cljs.core.UUID) x))
514522
(is (= x #uuid "d1a4adfa-d9cf-4aa5-9f05-a15365d1bfa6"))))
515523

516524
(deftest test-random-uuid
517525
(let [x (m/random-uuid)
518526
y (m/random-uuid)]
519-
(is (instance? #?(:clj java.util.UUID :cljs cljs.core.UUID) x))
520-
(is (instance? #?(:clj java.util.UUID :cljs cljs.core.UUID) y))
527+
(is (instance? #?(:clj java.util.UUID
528+
:cljr System.Guid
529+
:cljs cljs.core.UUID) x))
530+
(is (instance? #?(:clj java.util.UUID
531+
:cljr System.Guid
532+
:cljs cljs.core.UUID) y))
521533
(is (not= x y))))
522534

523535
(deftest test-regexp?

0 commit comments

Comments
 (0)