Skip to content

Instantly share code, notes, and snippets.

import SwiftData
import SwiftUI
@Model final class Parent {
init() {
child = Child()
}
@Transient let uuid = UUID()
@Relationship(deleteRule: .cascade, inverse: \Child.parent) var child: Child?
@domkm
domkm / default.css
Last active January 9, 2021 16:09
Annotated LightTable Theme
/* LightTable themes are just CSS. LightTable, CodeMirror, and plugins apply
classes to tokens within the text. Most of these classes are undocumented. I
had to go fishing with the dev inspector and apply brightly colored rules to
figure it out. Hopefully I can save you the trouble by documenting the default
theme. Please comment if you find any errors or omissions. */
/* These #multi rules apply to tabsets. Active means currently selected and dirty
means that the file has been edited since the last save. */
#multi.theme-default .tabset .list .active { color:var(placeholder-fg); }
#multi.theme-default .tabset.active .list .active { color:var(highlight-fg); }

Synthetic IDs and cache normalization in Apollo 3

We are using Apollo 2 in production and are very happy with it. Thanks for developing it! :) Now that Apollo 3 is out, we tried to upgrade and ran into some issues with caching.

Apollo 3 seems to believe that it is practical to manually specify merge strategies for every type and/or field (hundreds or thousands of lines of configuration) and also that this manual configuration cannot be checked at build time or start time, but instead fail eventually at runtime. To me, this sounds like an unacceptable combination. Given this, I set about writing code to inspect our schema and generate type policies. However, I ran into issues with Apollo not exposing sufficient information to build these policies.

I believe that a simple and general normalization strategy is sufficient for our use and for the vast majority of non-pathologic schemas that make the following assumptions:

  1. Most objects have ids that allow normalization
  2. Objects that do not have ids a
@domkm
domkm / machine.js
Last active April 14, 2020 16:55
Generated by XState Viz: https://xstate.js.org/viz
// Available variables:
// - Machine
// - interpret
// - assign
// - send
// - sendParent
// - spawn
// - raise
// - actions
@domkm
domkm / react_relay.clj
Created April 4, 2017 23:07
This is an incredibly hacky ClojureScript wrapper for Relay 0. While we used this in production at one point, I would recommend against doing so. I'm only uploading it for posterity. Relay 1, which decouples the React wrapper from the GraphQL client, will enable us to write a good CLJS wrapper, as opposed to this abomination.
(ns broadbrim.react-relay
(:require
[cljs.core :refer [specify! this-as js-arguments js-obj]]
[clojure.java.io :as io]
[clojure.string :as str]
[clojure.tools.macro :as macro]
[me.raynes.conch :as conch]
[potemkin]
[sablono.core :as sablono]
[taoensso.timbre :as log]))
;;
;; NS CHEATSHEET
;;
;; * :require makes functions available with a namespace prefix.
;;
;; * :use makes functions available without a namespace prefix
;; (i.e., refers functions to the current namespace).
;;
;; * :import refers Java classes to the current namespace.
;;
@domkm
domkm / gist:5769839
Created June 12, 2013 22:54
delegate methods to a serialized hash
class Asset < ActiveRecord::Base
def self.data_delegate(*methods)
methods.each do |method|
define_method(method) { data.send "[]", method }
define_method("#{method}=") { |val| data.send "[]=", method, val }
end
end
end
@domkm
domkm / broadbrim.datomic.api.cljc
Created December 16, 2015 07:57
Datomic EntityMap wrapper for DataScript consistency
;;;; Entity wrapper
#?(:clj (declare ->EntityMap))
#?(:clj (deftype EntityMap [^datomic.query.EntityMap entity ^boolean ident?]
Object
(hashCode [this]
(.hashCode entity))
(equals [this o]
(and (instance? (class this) o)
(.equals entity (.entity o))))
@domkm
domkm / gist:3536189
Created August 30, 2012 18:13
Dev Bootcamp Birthday Torture
def happy_birthday(name, torture_level = 100)
hb = "Happy Birthday to You."
song = "#{hb} #{hb} Happy Birthday Dear #{name}. #{hb}"
song.chars.reduce do |memo, char|
%w[a e i o u y].include?(char) ? memo + char * torture_level : memo + char
end
end
@domkm
domkm / namespace.clj
Last active August 29, 2015 14:13
ClojureScript reads records as maps. Bug?
(ns namespace)
(defrecord Language [name])
(defmacro lang [name]
(->Language name))
(def clj
(lang "Clojure"))