Skip to content

Instantly share code, notes, and snippets.

View ptaoussanis's full-sized avatar
👋
Hey! Hope you're having an awesome day :-)

Peter Taoussanis ptaoussanis

👋
Hey! Hope you're having an awesome day :-)
View GitHub Profile
;;; 13 June 2013: Clojure 1.5.1, Nippy mpenet/2.0.0-alpha3 (nio)
{:reader {:freeze 23491, :thaw 26074, :round 49720, :data-size 22956}}
{:defaults {:freeze 4080, :thaw 2432, :round 5961, :data-size 12403}}
{:encrypted {:freeze 5725, :thaw 3791, :round 9310, :data-size 12421}}
{:fast {:freeze 3479, :thaw 1981, :round 5462, :data-size 13343}}
;;; 13 June 2013: Clojure 1.5.1, Nippy 2.0.0-alpha1
{:reader {:freeze 23124, :thaw 26469, :round 47674, :data-size 22923}}
{:defaults {:freeze 4007, :thaw 2520, :round 6038, :data-size 12387}}
{:encrypted {:freeze 5560, :thaw 3867, :round 9157, :data-size 12405}}
(ns n01se.externs-for-cljs
(:require [clojure.java.io :as io]
[cljs.compiler :as comp]
[cljs.analyzer :as ana]))
(defn read-file [file]
(let [eof (Object.)]
(with-open [stream (clojure.lang.LineNumberingPushbackReader. (io/reader file))]
(vec (take-while #(not= % eof)
(repeatedly #(read stream false eof)))))))
;;; First we'll define a new kind of (degenerate) connection pool to encapsulate the behavior you want:
(defrecord SingletonPool [conn] ; Keeps a single connection atom
IConnectionPool
(get-conn [_ spec]
(or (when-let [c @conn] (when (conn-alive? c) c)) ; Aliveness check may not be necessary
(println "making a new conn!")
(reset! conn (make-new-connection spec))))
(release-conn [_ _] nil)
(release-conn [this _ _] nil)
@ptaoussanis
ptaoussanis / more-ifs.clj
Created July 31, 2013 11:22
Some `if`/`when` helpers. Don't need these often (and avoid them whenever possible), but they're occasionally handy when dealing with particularly hairy code.
(defmacro iff [test & {:keys [then else]}] `(if ~test ~then ~else))
(comment (iff false
:then (println "true")
:else (println "false")))
(defmacro iff-let [bindings & {:keys [then else]}] `(if-let ~bindings ~then ~else))
(comment (iff-let [x true] :else "false" :then x))
(defmacro if-lets
"Like `if-let` but binds multiple values iff all tests are true."
(ns n01se.externs-for-cljs
(:require [clojure.java.io :as io]
[cljs.compiler :as comp]
[cljs.analyzer :as ana]))
(defn read-file [file]
(let [eof (Object.)]
(with-open [stream (clojure.lang.LineNumberingPushbackReader. (io/reader file))]
(vec (take-while #(not= % eof)
(repeatedly #(read stream false eof)))))))
@ptaoussanis
ptaoussanis / Log-.md
Created February 26, 2016 08:15 — forked from bgrins/Log-.md
Prevent errors on console methods when no console present and expose a global 'log' function.

Javascript log Function

Every time I start a new project, I want to pull in a log function that allows the same functionality as the console.log, including the full functionality of the Console API.

There are a lot of ways to do this, but many are lacking. A common problem with wrapper functions is that the line number that shows up next to the log is the line number of the log function itself, not where log was invoked. There are also times where the arguments get logged in a way that isn't quite the same as the native function.

This is an attempt to once and for all document the function that I pull in to new projects. There are two different options:

  • The full version: Inspired by the plugin in HTML5 Boilerplate. Use this if you are writing an application and want to create a window.log function. Additionally,
@ptaoussanis
ptaoussanis / sente-ring-jetty9-adapter-example.clj
Last active July 29, 2020 12:46
Example of how to use Sente and Jetty 9 via `ring-jetty9-adapter`
;; Please see https://gist.github.com/wavejumper/40c4cbb21d67e4415e20685710b68ea0

Rich Hickey on becoming a better developer

Rich Hickey • 3 years ago

Sorry, I have to disagree with the entire premise here.

A wide variety of experiences might lead to well-roundedness, but not to greatness, nor even goodness. By constantly switching from one thing to another you are always reaching above your comfort zone, yes, but doing so by resetting your skill and knowledge level to zero.

Mastery comes from a combination of at least several of the following:

@ptaoussanis
ptaoussanis / stratch.clj
Last active December 9, 2021 18:08 — forked from danownsthisspace/stratch.clj
A function wrapper that ensures that a function can only be called once
(ns scratch.core
(:require [taoensso.encore :as enc]))
(defn wrap-once-in-a-while-1
"Uses atom + `swap-vals!`"
[^long msecs-period f]
(let [last-executed_ (atom 0)]
(fn wrapper [& args]
(let [[old new]
@ptaoussanis
ptaoussanis / transducers.clj
Last active December 17, 2021 13:54
Quick recap/commentary: Clojure transducers
(comment ; Fun with transducers, v2
;; Still haven't found a brief + approachable overview of Clojure 1.7's new
;; transducers in the particular way I would have preferred myself - so here goes:
;;;; Definitions
;; Looking at the `reduce` docstring, we can define a 'reducing-fn' as:
(fn reducing-fn ([]) ([accumulation next-input])) -> new-accumulation
;; (The `[]` arity is actually optional; it's only used when calling
;; `reduce` w/o an init-accumulator).