Skip to content

Instantly share code, notes, and snippets.

View ahmed1hsn's full-sized avatar
🎯
Focusing

Ahmed Hassan ahmed1hsn

🎯
Focusing
View GitHub Profile
{:deps
{org.clojure/clojure {:mvn/version "1.9.0"}
com.datomic/datomic-free {:mvn/version "0.9.5697"}}}
@gvolpe
gvolpe / di-in-fp.md
Last active September 16, 2024 07:18
Dependency Injection in Functional Programming

Dependency Injection in Functional Programming

There exist several DI frameworks / libraries in the Scala ecosystem. But the more functional code you write the more you'll realize there's no need to use any of them.

A few of the most claimed benefits are the following:

  • Dependency Injection.
  • Life cycle management.
  • Dependency graph rewriting.
(defn relate [& pairs]
(assert (even? (count pairs)) "relate requires an even number of arguments")
(->> pairs
(partition 2)
(map (fn [[k vs]] (map #(hash-map k %) vs)))
(apply map merge)))
(defn matches-specmap? [specmap m]
(reduce-kv
@borkdude
borkdude / specter.clj
Last active October 16, 2024 20:01
Vanilla Clojure vs. Specter vs. transducers
(ns specter-idea
(:require [com.rpl.specter :as specter :refer [setval ALL
NONE multi-path
selected?
pred
]]))
(def data ;; only x and y are allowed
[{:name "x" :rels ["x" "y"]} ;=> fine, keep as is
{:name "y" :rels ["x" "y" "z"]} ;=> keep only allowed rels: {:name "y" :rels ["x" "y"]}
@favila
favila / datomic-counter.clj
Created September 29, 2017 16:23
Demonstrate the creation and use of an auto-increment counter (with nonce) in datomic
(require '[datomic.api :as d])
(d/create-database "datomic:mem://counter-example")
;=> true
(def c (d/connect "datomic:mem://counter-example"))
;=> #'user/c
;; The essential features of creating and using an auto-increment counter in datomic:
;;
;; 1. A counter entity must store the current value and a nonce.

Thread Pools

Thread pools on the JVM should usually be divided into the following three categories:

  1. CPU-bound
  2. Blocking IO
  3. Non-blocking IO polling

Each of these categories has a different optimal configuration and usage pattern.

@reborg
reborg / rich-already-answered-that.md
Last active September 15, 2025 12:02
A curated collection of answers that Rich gave throughout the history of Clojure

Rich Already Answered That!

A list of commonly asked questions, design decisions, reasons why Clojure is the way it is as they were answered directly by Rich (even when from many years ago, those answers are pretty much valid today!). Feel free to point friends and colleagues here next time they ask (again). Answers are pasted verbatim (I've made small adjustments for readibility, but never changed a sentence) from mailing lists, articles, chats.

How to use:

  • The link in the table of content jumps at the copy of the answer on this page.
  • The link on the answer itself points back at the original post.

Table of Content

@boogie666
boogie666 / core.clj
Last active July 13, 2020 05:33
Core logic example
(ns logical-db.core
(:require [clojure.core.logic :as l]
[clojure.core.logic.protocols :refer [walk]]
[clojure.core.logic.pldb :as db]))
; [org.clojure/clojure "1.8.0"]
; [org.clojure/core.logic "0.8.10"]
(def db { :city->zip {"City1" [1 2 3 4] "City2" [5 6]}
@favila
favila / datomic-reset-attributes.clj
Last active January 12, 2025 14:04
Datomic transaction functions to "reset" attributes: i.e. make them have a post-transaction value you specify without having to enumerate the retractions.
(def tx-fns
[{:db/ident :db.fn/reset-attribute-values
:db/doc "Transaction function which accepts an entity identifier, attribute identifier
and set of values and expands to any additions and retractions necessary to
make the final post-transaction value of the attribute match the provided
values. Attribute values must be scalars.
If multiple values are provided on a cardinality-one attribute you will get a
datom conflict exception at transaction time."
:db/fn (d/function
@nathanmarz
nathanmarz / specter.zip.clj
Created February 16, 2016 16:36
Integrate zippers with Specter
(ns specter.zip
(:use [com.rpl.specter.macros :only [defpath]]
[com.rpl specter])
(:require [clojure [zip :as zip]]))
(def VECTOR-ZIP (view zip/vector-zip))
(def NEXT (view zip/next))
(def RIGHT (view zip/right))
(def LEFT (view zip/left))
(def DOWN (view zip/down))