Skip to content

Instantly share code, notes, and snippets.

;; Logging is a bit of a lost art. I see people use it the same way they use
;; println debugging, putting in lots of (log/debug "HERE") kind of stuff, and
;; then removing it afterwards.
;;
;; But with a good logging library these logging statements can continue to
;; provide value, even if (especially if) most of the time you turn them off.
;; For this you need to make good use of log levels like
;; error/warn/info/debug/trace. What follows is an illustrated example of how I
;; tend to use them.
(ns co.gaiwan.slack-widgets.ui.components
(:require
[clojure.string :as str]
[clojure.walk :as walk]
[reagent.core :as reagent]
[reagent.ratom :as ratom]
[lambdaisland.glogi :as log]
[co.gaiwan.slack-widgets.ui.state :as state]
[lambdaisland.ornament :as o])
(:require-macros [co.gaiwan.slack-widgets.ui.macros :refer [for!]]))
(ns lambdaisland.trikl1.simple-object-system
"Clojure's missing object system
An 'object' for us is an (r)atom which contains the object state, and metadata on
that atom which contains the methods, keyed by symbol.
A 'klass' is a map of methods, which can then be used as metadata on an object
to 'instantiate' an object.
[[call]] handles calling a method, passing it `this` (the atom) and any
(ns the-clouncil)
(def posts
(sort-by :date (read-string (slurp "posts.edn"))))
;; Original version: mapcat + reduce
;; <-- in | code | out -->
(ns the-clouncil)
(def posts
(sort-by :date (read-string (slurp "posts.edn"))))
(->> posts
(mapcat (fn [{:keys [categories] :as post}]
(map (fn [category]
[category post])
categories)))
{:paths
["src" "resources"]
:deps
{org.clojure/clojure {:mvn/version "1.11.0"}
protojure/protojure {:mvn/version "1.7.3"}}}
#!/usr/bin/env bb
;; lein2deps | jet --pretty > deps.edn
(require '[clojure.string :as str]
'[clojure.edn :as edn])
(defn read-project-clj []
(-> "project.clj"
slurp