Skip to content

Instantly share code, notes, and snippets.

View baweaver's full-sized avatar
📝
Documenting things

Brandon Weaver baweaver

📝
Documenting things
View GitHub Profile
@baweaver
baweaver / deep_group.rb
Created August 2, 2022 05:53
Deep grouping, because I keep doing something like this by hand and it gets hard to keep track of.
module DeepGroup
class Grouping
IDENTITY = -> v { v }
def initialize(state)
@state = state
@groupings = []
@mapping = IDENTITY
end
@baweaver
baweaver / evolution_of_ruby_programmer.md
Last active February 22, 2024 21:27
Very much work in progress, will amend this as I have time. Feel free to comment ideas.
@baweaver
baweaver / quick_adt.rb
Last active May 24, 2022 07:34
Quick musing on ADT in Ruby using Sorbet, name TBD. May gemify it later.
require "sorbet-runtime"
module ADT
module DeconstructableSorbetStruct
def deconstruct
self.class.props.map { send(_1) }
end
def deconstruct_keys(keys)
return self.class.props.to_h { |k| [k, send(k)] }
@baweaver
baweaver / code_migration_hypothetical.rb
Created March 9, 2022 07:05
Experimentation on what a code migration syntax might look like, ideally
module CodeMigrations
# Number isn't important, vague syntax, and not all
# of these are specifically Rails examples
version from: 4.0, to: 5.0
# The easiest case, literally A to B direct translation.
class FilterToAction < Migration
expect_translation(
"after_filter" => "after_action",
# ...snipped excess for example
@baweaver
baweaver / block_transform_ast.rb
Last active August 3, 2023 22:53
Pattern matching applied to ASTs, defining the transformation between shorthand and standard block format.
require "rubocop"
# Useful for debugging and seeing how the nodes deconstruct
def deep_deconstruct(node)
return node unless node.respond_to?(:deconstruct)
node.deconstruct.map { deep_deconstruct(_1) }
end
def block_to_shorthand?(a, b)
@baweaver
baweaver / tree_difference.rb
Last active February 16, 2022 08:43
Tree differences, naive initial version, need to see if there's a nicer way to approach this....
require "rubocop"
def tree_distance(object_a, object_b)
tree_distance_matrix(object_a, object_b).last.last
end
def tree_distance_matrix(object_a, object_b)
a_size, b_size = object_a.size, object_b.size
# Rows and columns ascend from 0 to size + 1
@baweaver
baweaver / proc_ast_sql.rb
Created February 3, 2022 09:56
Proc to AST applied to potential foundation for SQL hackery
require 'proc_to_ast'
def where(&fn)
ast = fn.to_ast
source = fn.to_source
pp ast:, source:
end
where { age > 18 && occupation.downcase == 'plumber' }
@baweaver
baweaver / ruby_without_e.rb
Created February 2, 2022 02:10
I present to you a horror from the depths, programming Ruby without the letter "e"
c = '' << 101
SUB = /___/
subs = -> s { s.gsub(SUB, c) }
fn = "/tmp/runs.rb"
# Patch it in for fun
`#{c}cho 'alias run #{subs['___val']}' > #{fn}`
load fn
mm = <<~ABC
require 'benchmark/ips'
class TimeFilter
attr_reader :start, :finish
def initialize(start, finish)
@start = start
@finish = finish
end
@baweaver
baweaver / html_rb.rb
Last active August 3, 2021 19:58
Quick HTML builder idea
module HTML
VALID_TAGS = %i(html p div span a ol ul li strong em table thead tr td th tbody article aside)
SELF_CLOSING_TAGS = %i(img br hr)
# Evaluates a block passed to it for HTML tags. This is done to isolate
# defined tag methods from the outside world, hence `instance_eval` to
# evaluate that block in the context of an HTML structure.
class Evaluator
attr_reader :contents