Skip to content

Instantly share code, notes, and snippets.

View DivineDominion's full-sized avatar

Christian Tietze DivineDominion

View GitHub Profile
@DivineDominion
DivineDominion / 201801041611 Focus ReSwift reducers to one state change.md
Created January 15, 2018 15:51
Zettel note about ReSwift reducer partitioning

Title: Focus ReSwift reducers to one state change ID: 201801041611 Tags: #reswift #srp

ReSwift reducers should not have conditional side-effects, changing different states out of convenience. That makes it hard to notice which action changed what. The condition is most of the problem, I think.

An ideal approach would be to have 1 reducer/action pair for each substate change.

When reducers overlap (they touch the same state), this can become a problem. (IncreaseCounter and DecreaseCounter are a bad example.) Conditional changes to another substate should be extracted as another action which is dispatched by a Middleware under similar circumstances.

struct Foo: ExpressibleByBooleanLiteral {
var value: Bool
init(booleanLiteral value: BooleanLiteralType) {
self.value = value
}
}
func ==(lhs: Foo, rhs: Foo) -> Bool {
return lhs.value == rhs.value
}
@DivineDominion
DivineDominion / Example.swift
Last active July 5, 2021 10:22
Extension to @IanKeen's Partial<T> for more sexy and very verbose validations
// - MARK: Example Code
/// A model
struct User {
let firstName: String
let lastName: String
let age: Int?
}
/// Initializer using a Partial<T> -- You could generate this with Sourcery
@DivineDominion
DivineDominion / AppDelegate.swift
Created December 19, 2018 11:25
`NSAppearance` change notification when you cannot use `NSApp.effectiveAppearance` which is available for macOS 10.14+ only
import Cocoa
import RxSwift
import RxCocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
@IBOutlet weak var window: NSWindow!
let disposeBag = DisposeBag()
@DivineDominion
DivineDominion / reswift-order.md
Created June 17, 2019 08:21
How to affect the order of subscription callbacks in ReSwift/Redux

Affect the order/priority of subscription callbacks in ReSwift

(Reply to "Any way to control the priority of subscription callbacks?" ReSwift/ReSwift#404)

ReSwift does not guarantee any subscription callback order. Since ReSwift uses an unordered Set as its subscription store, there's no reliable way to know when a subscription is invoked.

This implementation detail is hidden by design. If you find yourself wanting to affect the order of subscription callbacks, there's a concept of a sequence waiting to be extracted somehow.

These are the ways out:

Keybase proof

I hereby claim:

  • I am divinedominion on github.
  • I am ctietze (https://keybase.io/ctietze) on keybase.
  • I have a public key ASAeEXhO_3ukmYArB4BCULSfFFT-rpg6j_aXiWWv_zmBEwo

To claim this, I am signing this object:

@DivineDominion
DivineDominion / execute.rb
Last active October 29, 2019 08:23
Extract note links from a source note
#!/usr/bin/env ruby
# Avoid all the script configuration and use this convenience script instead!
#
# 1) Put it into the same folder,
# 2) run the script: `ruby _execute.rb PATH/TO/THE_NOTE.txt`
##################
# Configure here #
@DivineDominion
DivineDominion / gdcr2019.rb
Created November 16, 2019 15:32
A weird implementation idea for Game of Life
#!/usr/bin/env ruby
require "rspec"
class God
def kill!(cell)
cell.sacrifice_to self
end
def surrender(process)
@DivineDominion
DivineDominion / random_file.rb
Last active April 4, 2020 08:38
Find a random plain text file in a directory
#!/usr/bin/env ruby
# Usage: random_file.rb [options]
# -d, --dir [VALUE] Path to the note archive. Default: the current working directory.
# -c, --count [VALUE] Amount of unique random notes to fetch
# -h, --help Prints this help
require "optparse"
CURRENT_PATH = Dir.pwd
@DivineDominion
DivineDominion / find_zettel_orphans.rb
Last active May 2, 2020 07:47
In a directory of Zettel notes, find all those without incoming links
#!/usr/bin/env ruby
require 'set'
# Change the path here:
ARCHIVE = '~/Archive/'
EXTENSIONS = %w{.md .txt .markdown .mdown .text}
#################################################################