Skip to content

Instantly share code, notes, and snippets.

@isiahmeadows
isiahmeadows / promise-settle.js
Last active May 2, 2020
Promise synchronous settle
View promise-settle.js
const call = Function.call.bind(Function.call)
// `onSettled` is just `onSettled(value, isSuccess)`.
Promise.hookIntoSettlement = (thenable, onSettled) => {
function settle(value) {
let settled = false
let then
function fail(e) {
if (!settled) {
settled = true
@isiahmeadows
isiahmeadows / mithril-react.mjs
Last active Sep 2, 2020
Mithril to React adapters
View mithril-react.mjs
import m from "mithril"
import React, {useLayoutEffect, Component} from "react"
import ReactDOM from "react-dom"
// Bottom-up to Mithril, top-down to React
export function useMithril(ref, view) {
useLayoutEffect(() => { m.render(ref.current, view()) })
useLayoutEffect(() => () => { m.render(ref.current, null) }, [])
}
View foo.js
import {api} from '../../share/hlp'
import Header from './header'
import pgList from '../../cmp/pgList'
import editBox from '../../cmp/editBox'
import Modal from '../../cmp/modal'
export default function Storage(){
let modalstate = false
let folderView = 1
let folder = ""
let dataList = []
@isiahmeadows
isiahmeadows / mini-css-in-js-framework-docs.md
Last active May 1, 2019
Mini CSS-in-JS framework in under 50 lines of ES6 code
View mini-css-in-js-framework-docs.md

A mini CSS-in-JS framework

It exports two functions:

  • renderToString(styles) - Render the CSS to a string. (This has no DOM dependency, and it omits the @charset - that's for you to set.)
  • renderToDOM(styles) - Render the CSS to the DOM.

Note that renderToString omits any charset - the user should specify that before emitting.

Styles are specified as follows:

@isiahmeadows
isiahmeadows / mithril-fontawesome.js
Last active Jan 23, 2020
Mithril port of react-fontawesome
View mithril-fontawesome.js
// This is a direct API port of https://github.com/FortAwesome/react-fontawesome
// to Mithril, with a few optimizations for faster vnode creation and more
// efficient normalization. It's also combined into a single UMD file and
// written to support a pure ES5 environment without transpiling. It's less than
// 200 lines of code excluding this long introductory comment, and is about
// 1.2KB min+gzip.
//
// Here's a few example vnodes:
//
// ```js
View id-generate.js
"use strict"
// Creates a `generate` function using an alphabet, for optimally small IDs
// if you can only use certain characters. This could be useful for file name
// generators, minifiers, among many others. You *do* need to expand letter
// ranges, though.
module.exports = alphabet => {
const charTable = [...new Set(Array.from(alphabet, x => `${x}`))]
let counter = 0
if (charTable.length < 2) {
@isiahmeadows
isiahmeadows / classnames-object.js
Created Dec 16, 2018
`classnames`, but emitting an object instead of a string.
View classnames-object.js
var hasOwn = {}.hasOwnProperty
function writeClasses() {
for (var i = 0; i < arguments.length; i++) {
var arg = arguments[i]
if (!arg) continue
if (typeof arg === 'string' || typeof arg === 'number') {
this[arg] = true
} else if (typeof arg === 'string') {
@isiahmeadows
isiahmeadows / 0-react-hooks.jsx
Created Oct 29, 2018
React if they went with a new language rather than an embedded DSL
View 0-react-hooks.jsx
// This is a rough port of their TodoMVC app, using their Hooks API
import React, { useRef, useState, useEffect, useMemo } from "react"
import { render } from "react-dom"
function uuid() {
let uuid = ""
for (let i = 0; i < 32; i++) {
if (i === 8 || i === 12 || i === 16 || i === 20) uuid += "-"
View uncached-load.js
var Module = require("module")
function requireUncached(file, baseDir) {
// Hack: hijack Node's internal resolution algorithm to require the file
// as if from a fake module in the correct base directory. It also will
// avoid several bugs with the `resolve` module (Node's is necessarily
// more stable).
var dirname = path.resolve(baseDir)
var m = new Module(path.join(dirname, "dummy.js"))
@isiahmeadows
isiahmeadows / mithril-remove-node-from-dom.js
Created Aug 28, 2018
Recast Mithril node removal code
View mithril-remove-node-from-dom.js
function removeNodeFromDOM(vnode) {
var parent = vnode.dom.parentNode
if (parent != null) {
var count = vnode.domSize
if (count != null && count > 1) {
while (--count) parent.removeChild(vnode.dom.nextSibling)
}
parent.removeChild(vnode.dom)
}
}