Skip to content

Instantly share code, notes, and snippets.

@girvo
girvo / decoder-inference.js
Last active March 26, 2018 13:48
Flow type inference using the "decoders" library
// @flow
import { guard, object, string, number } from 'decoders'
import type { Decoder } from 'decoders'
// This is the type-level "function" that pulls the generic out of the decoder
type ExtractDecoderType = <T>(d: Decoder<T>) => T
// Now we define our run-time decoder, without defining the type first...
const person = object({
name: string,
@girvo
girvo / utils.re
Created January 17, 2018 08:29
A small utility module I use with my ReasonML projects
module Result = {
type result('a, 'b) =
| Ok('a)
| Error('b);
let isOk = (result_) =>
switch result_ {
| Ok(_) => true
| Error(_) => false
};
let isError = (result_) =>
@girvo
girvo / Parser.fs
Created December 10, 2016 00:31 — forked from xavierzwirtz/Parser.fs
module Emly.Parser
open Emly.UntypedAST
open FParsec
open FParsec.CharParsers
open Emly.ParserUtils
open Emly.ParserUtils.IndentationParserWithoutBacktracking
let keywords =
Set.ofList ["let"; "fun"; "rec"; "impure"; "in"; "of"; "if"; "then"; "else"; "match"; "with"; "type"; "foreign"; "mutable"]
/**
* Tiny module to generate an Express middleware that maps the request path to
* a specified folder, allowing for "semi-static" routes without needing to
* define them ahead of time.
*
* Configuration can be passed to the `semiStatic` function when registering the
* middleware. The format is described below, with the "context" property being
* passed to the template's render call, and `context.req` being the request
* object itself.
*
@girvo
girvo / either.nim
Created June 9, 2016 07:32
An Either monad(ish) implementation for Nim v0.14
## A right-biased Either[L, R] implementation in Nim
import optional_t
type
EitherType* {.pure.} = enum
Left, Right
Either*[L, R] = object
kind: EitherType
right: Option[R]
@girvo
girvo / redux-inject.js
Created March 8, 2016 02:45 — forked from AdamMaras/redux-inject.js
Redux dependency injection middleware
export default function createInjectMiddleware(map) {
return store => next => action => {
if (typeof action !== "object"
|| typeof action.payload !== "function"
|| action.meta == null
|| action.meta.inject == null) {
return next(action);
}
const defaultInjections = {
@girvo
girvo / BackgroundTask.h
Created March 2, 2016 06:38 — forked from liamzebedee/BackgroundTask.h
Attempts at implementing background tasks in React Native iOS
//
// BackgroundTask.h
// tomtrack
//
// Created by Liam Edwards-Playne on 13/02/2016.
//
#import "RCTBridgeModule.h"
@interface BackgroundTask : NSObject <RCTBridgeModule>
@girvo
girvo / sdl2_opengl.c
Created January 6, 2016 03:33 — forked from exavolt/sdl2_opengl.c
Very basic SDL2 OpenGL application
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_opengl.h>
@girvo
girvo / private-query-vars.js
Last active August 29, 2015 14:27 — forked from kadamwhite/private-query-vars.js
Query vars for WP-API, trying to understand how everything works
module.exports = [
'offset', // (int) - number of post to displace or pass over. Warning: Setting the offset parameter overrides/ignores the paged parameter and breaks pagination (Click here for a workaround). The 'offset' parameter is ignored when 'posts_per_page'=>-1 (show all posts) is used.
'posts_per_archive_page', // (int) - number of posts to show per page - on archive pages only. Over-rides posts_per_page and showposts on pages where is_archive() or is_search() would be true.
// 'showposts', // <replaced by posts_per_page>
'nopaging', // (boolean) - show all posts or use pagination. Default value is 'false', use paging.
'post_type', // (string / array) - use post types. Retrieves posts by Post Types, default value is 'post'.
'post_status', // (string / array) - use post status. Retrieves posts by Post Status. Default value is 'publish', but if the user is logged in, 'private' is added.
'category__in', // (array) - use ca