Skip to content

Instantly share code, notes, and snippets.

@susisu
susisu / function.mjs
Created January 29, 2023 11:03
CloudFront Function for websites using CloudFront + S3 + Next.js static export (as of v13)
/* eslint-disable no-var, vars-on-top, no-param-reassign */
function redirect(uri) {
// remove repeated slashes
uri = uri.replace(/\/+/g, "/");
// remove trailing slash
if (uri !== "/" && uri.endsWith("/")) {
uri = uri.slice(0, -1);
}
return uri;
@susisu
susisu / js_typeclass.md
Created December 11, 2014 16:22
JavaScript による型クラスの表現

JavaScript による型クラスの表現

この記事は OUCC アドベントカレンダー 2014 12日目の記事です. 岡山大学サイクリング部ではなく, 大阪大学コンピュータクラブです. 昨日は @klta6154 さんによるマスタリングTCP/IP OpenFlow編読みました記でした.

毎度ありがとうございます. (@susisu2413) です.

この記事では JavaScript を使って, Haskell などの言語に存在する "型クラス" のようなものを書いて遊んでみます. ちょくちょく Haskell が登場しますが, Haskell の知識がなくてもある程度読めるように配慮したつもりです. ただ, 流石に JavaScript の説明をしながら型クラスの説明をするのは地獄なので, JavaScript がある程度わかることを前提で書いています.

var Monoid = {
mempty: function (m) { return m.__Monoid__.mempty; },
mappend: function (m) { return m.__Monoid__.mappend; },
mconcat: function (m) {
return function (array) {
return array.reduceRight(
function (a, b) { return Monoid.mappend(m)(b, a); },
Monoid.mempty(m)
);
};
@susisu
susisu / brainfuck.ts
Created March 9, 2020 20:08
Type-level Brainfuck interpreter in TypeScript
// Type-level Brainfuck interpreter in TypeScript
// Copyright (c) 2020 Susisu (susisu2413@yahoo.co.jp)
type State<P, M, I, O, R, K> = {
program: P,
memory: M,
input: I,
output: O,
return: R,
skip: K,
@susisu
susisu / say.md
Last active January 22, 2020 16:07
非実用 say コマンド

非実用 say コマンド

おはようございます. @susisu2413 です. この記事は OUCC アドベントカレンダー 2014 1日目の記事です. が, 誰も登録されていなかったので急遽書くことになりました. しかたがないので適当な記事でハードルを下げつつお茶を濁そうと思います.

say コマンド

say コマンドをご存知でしょうか. Mac に標準で入っている音声読み上げコマンドです. 最近, レポート作成の疲れから say コマンドで遊んでみたら思いの外面白かったので記事にしてみました.

import * as lq from "@loquat/simple";
const key = Symbol("handle");
type PerformFunc = <U>(parser: lq.Parser<U>) => U;
export function handle<T>(func: (perform: PerformFunc) => T): lq.Parser<T> {
return new lq.StrictParser(state => {
let currentState = state;
let currentErr = lq.ParseError.unknown(state.pos);
@susisu
susisu / test.ts
Last active April 29, 2019 02:43
const ref = <T>(f: (x: T) => T) => {
const r = { val: f };
return () => r;
};
const id = <T>(x: T) => x;
// r: <T>() => { val: (x: T) => T }
const r = ref(id);
// unsafe instantiations of r
const r1 = r<number>();
@susisu
susisu / functional_js_tsurai.md
Last active March 3, 2019 18:38
関数型 JavaScript がつらい

関数型 JavaScript がつらい

明けましておめでとうございます. @susisu2413 です.

この記事は OUCC アドベントカレンダー 2014 21日目の記事です. 昨日は @spring_raining 氏による大学のグループ開発でgitを布教する方法でした.

JavaScript での関数型処理

盛んに「関数型で脱アルゴリズム」などと叫ばれる昨今ですが, その真偽はさておき, 処理の単位として関数を用いるのは処理の一般化や再利用をする場合に役に立つことが多いです (たぶん). 関数型っぽい処理としては, 生の JavaScript では Array のメソッドに map, filter, reduce などがあります

const apply = <T, U>(f: (x: T) => U) => (x: T) => f(x);
const foo = <T extends { foo: number }>(x: T) => x.foo;
const foo2 = apply(foo); // : (x: {}) => number;
foo({ foo: 1, bar: 2 }); // OK
foo({}); // error
foo2({ foo: 1, bar: 2 }); // OK
foo2({}); // OK???
@susisu
susisu / test.hs
Last active January 15, 2019 08:20
-- tf-random 0.5
import System.Random.TF.Gen
-- Utility functions to choose one of splitted generators.
left g = let (g', _) = split g in g'
right g = let (_, g') = split g in g'
-- Initialize a generator (the seed is not relevant).
gen = seedTFGen (0, 0, 0, 0)
-- Let `b` be the tree position bits of a generator and `bi` the index in it. Now `b` and `bi` of