Skip to content

Instantly share code, notes, and snippets.

View bfollington's full-sized avatar
😈
scheming

Ben Follington bfollington

😈
scheming
View GitHub Profile
@bfollington
bfollington / workflow.fs
Last active July 22, 2020 04:48
Imagining a workflow DSL
module Sketch
type Step =
| VSI
| BusinessAddress
| Offer
| AccountHolder
| BusinessDetails
| Identity
| Concessions
import React, { ChangeEvent } from "react";
import "./App.css";
import { RecoilRoot, atom, useRecoilState } from "recoil";
const useRecoilReducer = <S, A>(
reducer: (s: S, a: A) => S,
recoilState: any
) => {
const [state, setState] = useRecoilState(recoilState);
const dispatch = (a: A) => {
@bfollington
bfollington / structural-typing.ts
Created April 27, 2020 04:18
A quick demo of structural typing and JS object semantics in TS
type User = { name: string, email: string }
type Admin = { name: string, role: string }
// Let's say hi to a user!
const greet1 = (u: User) => console.log(`Hi, ${u.name}`)
// What if we want to greet an Admin though... We can't re-use this
// What about taking a page out of C#'s book and use an interface?
interface INamed { name: string }
@bfollington
bfollington / App.tsx
Last active April 29, 2022 07:20
useReducer + @reduxjs/toolkit
import React, { useReducer } from "react";
import { messages, initialMessagesState } from "./slices/messages";
const App: React.FC = () => {
const [messageList, dispatch] = useReducer(
messages.reducer,
initialMessagesState
);
return (
@bfollington
bfollington / writeUnityVersion.js
Created November 17, 2019 04:25
Write package.json version to ProjectSettings.asset
const fs = require('fs')
const package = require('./package.json')
const projectSettingsPath = 'ProjectSettings/ProjectSettings.asset'
const re = /bundleVersion:\s(\d\.\d\.\d)$/gm
const fileStr = fs.readFileSync(projectSettingsPath, 'utf8')
const updated = fileStr.replace(re, `bundleVersion: ${package.version}`)
console.log(`bundleVersion: ${package.version}`)
@bfollington
bfollington / lens.ts
Last active August 20, 2019 10:02
A moderately generic, moderately concise + typesafe lens implementation...
type Lens<R, K extends keyof R, O> = {
get(action: R):O,
set(action: R, value:O): R
}
function lens<R, K extends keyof R, O>(field: K): Lens<R, K, O> {
return {
get(action: R): O {
return (action[field] as unknown) as O
},
@bfollington
bfollington / lens.ts
Created August 20, 2019 09:04
A much more complicated, generic, typesafe lens implementation for Typescript
function lens<K extends string>(key: K) {
return <const>{
get: function<R extends any>(record: R): K extends keyof R ? R[K] : unknown {
const k: string = key
return record[k]
},
set: function<R extends any>(record: R, value: R[K]) {
return record.hasOwnProperty(key) ?
{
...record,
@bfollington
bfollington / lens.ts
Created July 16, 2019 00:12
A concise, typesafe lens implementation in TypeScript
interface INamed<T> {
name: T
}
export const Name = {
get<T>(named: INamed<T>) {
return named.name
},
set<T>(named: INamed<T>, value: T) {
return {
@bfollington
bfollington / MouseCursor.cs
Created June 23, 2019 00:40
Isometric mouse cursor snapping
void Update()
{
RaycastHit hit;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit, 100, FloorLayer)) {
Transform objectHit = hit.transform;
if (SnapToGrid) {
var newPos = new Vector3(Round(hit.point.x, GridSize), _yOffset, Round(hit.point.z, GridSize));
@bfollington
bfollington / RoomData.cs
Created June 21, 2019 23:37
Room data serialization
using UnityEngine;
namespace GridBased {
[CreateAssetMenu]
public class RoomData : ScriptableObject {
public GameObject ModelPrefab;
public Vector2 Dimensions;
public Vector2 Origin;
public TextAsset Layout;
}