Skip to content

Instantly share code, notes, and snippets.

View gist:30894e53da19d712021906629cf1583c
(defn frequencies-by
"Returns a map from distinct results of (f item) in coll
to a vector duple of all (k item) (if k is provided, or items otherwise)
with the same (f item) value, and the number of times (f item) appears.
"
([f coll]
(frequencies-by f nil coll))
([f k coll]
(persistent! ;; copied from clojure.core
View gist:679561f6da86863316499fe134c31dd7
(defn slow-assoc [m & [k v & kvs :as dat]]
(if (empty? dat)
m
(apply slow-assoc (assoc m k v) kvs)))
(defn emit-assoc [ [ksym vsym]]
`(assoc ~ksym ~vsym))
(defmacro fast-assoc [msym & kvsyms]
(let [assocs (map #(emit-assoc %)
View Composable Rules
(defn monoid* [init body]
`(fn f#
([]
(fn [& ~'xs] ~init))
([~'r]
(fn [& ~'xs] (~body (apply ~'r ~'xs))))
([~'r1 ~'r2]
(fn [& ~'xs] (~body(apply ~'r1 ~'xs) (apply ~'r2 ~'xs))))
([~'r1 ~'r2 & ~'rs]
(fn [& ~'xs]
@KingCode
KingCode / gist:8970fe4e2308127ba467ac7f57d3f78b
Created Oct 16, 2020
Hand rolled sequence to prevent chunking
View gist:8970fe4e2308127ba467ac7f57d3f78b
(defn lazify [[x & xs :as coll]]
(lazy-seq
(when (seq coll)
(cons x (lazify xs)))))
(def my-lazy-input (lazify [1 2 4 1 2 3 1]))
(type my-lazy-input) ;; => clojure.lang.LazySeq
(type (rest my-lazy-input)) ;; => clojure.lang.LazySeq
;; So my-lazy-input is truly lazy all the wal...Now I want to feed it to 'sequence
@KingCode
KingCode / my-ns-test.clj
Last active Jul 1, 2020
Properties test for Functional-TV challenge #384
View my-ns-test.clj
;; see
;; https://gist.github.com/ericnormand/81722b80fc7d0b2972fda68652489f65
(ns my-ns-test
(:require [my-ns :as sut]
[clojure.test.check.properties :as prop]
[clojure.test.check.generators :as gen]
[clojure.test.check.clojure-test :refer [defspec]]))
(let [alias-str "sut"
sym (symbol (str alias-str "/parallel?"))]
@KingCode
KingCode / gist:773560f4ab5bf91e660a2a26e581b036
Last active Nov 2, 2020
cond-let and cond-let> macros, to leverage bindings between test and result expressions, as well as earlier ones (for cond-let)
View gist:773560f4ab5bf91e660a2a26e581b036
(ns cond-let)
;; (cond-let
;; (odd? x) [x n] (inc x)
;; (< n 10) [y (inc n)] 10
;; :else n))
;; we want the above to yield
;; (let [x n]
;; (if (odd? x)
;; (inc x)
@KingCode
KingCode / gist:a954ced2aeaa22f34332fc81f75f9969
Last active Oct 27, 2018
Scoping transducer for pipelining sub-structures without losing the container.
View gist:a954ced2aeaa22f34332fc81f75f9969
(require '[clojure.core.async :as async :refer [chan <!! put!]])
(defn save-to [c save-f]
(fn [rf]
(fn
([] (rf))
([acc] (rf acc))
([acc x]
(put! c (save-f x))
(rf acc x)))))
@KingCode
KingCode / transducer.clj
Last active Oct 1, 2018
An implemementation of the transducer API from scratch, as a learning aid.
View transducer.clj
(ns scratch.transducer
(:refer-clojure :exclude [comp map filter mapcat take drop
take-while drop-while
dedupe
distinct
reductions
;; sequence
transduce]))
View gist:ef2ac029dbcf2881ad1762611f837d56
(ns hellospec.fizzbuzz
(:require [clojure.spec :as s]
[clojure.spec.test :as stest]
;; to accomodate KLIPSE:
;; "[...]cljs.spec.gen.frequency is undefined[...]"
#?(:clj [clojure.spec.gen :as gen]
:cljs [clojure.test.check.generators :as gen])))
;; A fizzbuzz which doesn't use condition checking/branching
(defn fizzbuzz
@KingCode
KingCode / gist:101ff425f1abd9693a7e8c4b5d389e74
Created Oct 20, 2016
clojure.spec usage where instrumenting a function seems to cause exercise-fn to generate non-compliant input?? See line 61 below
View gist:101ff425f1abd9693a7e8c4b5d389e74
(require '[clojure.spec :as s]
'[clojure.spec.test :as stest])
(defn fizzbuzz
([m1 m2 n]
(let [ c #(->> % vector (concat (-> %2 dec (repeat nil))) cycle)
fb-re #"Fizz|Buzz|FizzBuzz"]
(->> [(c "Fizz" m1), (c "Buzz" m2)]
(apply map
(fn [i m1 m2]