Skip to content

Instantly share code, notes, and snippets.

@myobie
myobie / next-tick.ts
Last active May 6, 2020 19:14
Do some work next time the event loop is free
export function nextTick<O> (cb: () => O | Promise<O>): Promise<O> {
return new Promise((resolve, reject) => {
requestAnimationFrame(() => {
Promise.resolve(cb())
.then(value => resolve(value))
.catch(e => reject(e))
})
})
}
@myobie
myobie / uuids.ex
Created April 27, 2020 16:13
Save 14 characters for UUIDs
def generate_id do
result =
Ecto.UUID.generate()
|> String.replace(~r/-+/, "")
|> Base.decode16(case: :lower)
case result do
:error ->
throw("Something went wrong generating a uuid")
defmodule Example.RandomTest do
use ExUnit.Case
test "loads wasm file" do
{:ok, bytes} = File.read("priv/vendor/needs-random.wasm")
{:ok, agent} = Agent.start_link(fn -> nil end)
{:ok, instance} =
Wasmex.start_link(%{
const handler = require('serve-handler')
const { createServer } = require('http')
const launcher = require('chrome-launcher')
const remoteInterface = require('chrome-remote-interface')
let exitStatus = 0
const baseURL = 'http://localhost:6000'
const server = createServer((request, response) => {
@myobie
myobie / state.js
Last active April 16, 2020 15:13
A not very sophisticated "store" where I can dispatch "actions" if a very typesafe way
// Fake immer
/** @template T */
export class State {
/** @typedef {function(T):void} Callback */
/** @typedef {function(): T} InitialValueFactory */
/**
* @param {T | InitialValueFactory} initialValue
*/
@myobie
myobie / dropzone.js
Last active April 15, 2020 11:32
Gives one a div which will overlay the page when a file is dragged onto the window and lets one specify a callback which will receive the files which were dropped if any (using a new as-of-yet-unpublished state library)
import { html, css, globalCSS } from './html.js'
import { State } from './state.js'
const isDraggingOver = new State(false)
let runOnce = false
isDraggingOver.onUpdate(newState => {
const root = document.documentElement
const dropzoneDisplay = newState ? 'block' : 'none'
root.style.setProperty('--dropzone-display', dropzoneDisplay)
@myobie
myobie / simple-state.js
Last active April 14, 2020 08:21
Very simple state class with an update callback
/** @template T */
class State {
/** @typedef {function(T):void} Callback */
/**
* @param {T} initialValue
*/
constructor (initialValue) {
this.value = initialValue
@myobie
myobie / likes.js
Last active April 11, 2020 16:24
Prototyping the dream code for a new frontend framework
import { createStorage } from './bassics/storage'
import { html, until, render } from './bassics/html'
const storage = createStorage()
const likes = storage.state('likes', fetchLikes())
function reloadLikes () {
return likes.update(fetchLikes())
}
@myobie
myobie / gen-indexes.js
Created April 10, 2020 18:12
Wrap an async generator with index generation
/**
* @template T
* @param {AsyncGenerator<T, void, void>} gen
* @returns {AsyncGenerator<[T, number], void, void>}
*/
export async function * genIndexes (gen) {
let i = 0
for await (const item of gen) {
yield [item, i]
i++
@myobie
myobie / outline.md
Created April 4, 2020 17:02
Outline for my blog post about getting started with wasm
  • Why?
    • Use existing code and libraries, especially for encryption or hashing
    • Sharing code for algorithms or compute intensive operations
    • Don’t intend expose much (anything?) to the wasm instance
    • There some gotchas like 64bit integers
  • Browser only, no toolchain
    • I have toolchain fatigue and it turns out the latest browsers are kinda great
    • import and export, async and await, wasm, etc all work
    • I like to use a tiny file server to serve a directory on a port on localhost
  • serve