Skip to content

Instantly share code, notes, and snippets.

View venil7's full-sized avatar
turning coffee into code

Art Deineka venil7

turning coffee into code
View GitHub Profile
@venil7
venil7 / reader-monad.ts
Last active August 29, 2022 03:19
Reader Monad in TypeScript
class ReaderMonad<A, B> {
constructor(public runReader: (a: A) => B) {
}
bind<C>(func: (b: B) => ReaderMonad<A, C>): ReaderMonad<A, C> {
return new ReaderMonad<A, C>((a: A) => {
const b = this.runReader(a);
return func(b).runReader(a);
});
}
@venil7
venil7 / unlim-arity.ts
Last active May 4, 2018 19:50
Unlimited arity curried computation
const aux = (f: (a,b) => number, acc: number) =>
(n?: number) => (n !== undefined) ? aux(f, f(acc, n)) : acc;
const add = (a, b) => a + b;
const mul = (a, b) => a * b;
const sum = aux(add, 0);
const product = aux(mul, 1);
const sum1 = sum(2)(3)(5)(); //10
@venil7
venil7 / maybe.ts
Created May 11, 2018 11:35
Maybe monad in TypeScript
class Maybe<T> {
constructor(private val: T) { }
with<Z>(f: (z: T) => Z): Maybe<Z> {
return new Maybe(this.return(f));
}
return<Z>(f: (z: T) => Z): Z {
try {
return (f(this.val));
} catch (err) {
return undefined;
@venil7
venil7 / ReducerComponent.re
Created August 26, 2018 13:24
ReasonReact reducer component boilerplate
type state = {a: int};
type action =
| Remove
| Add
| Update;
let component = ReasonReact.reducerComponent("ReducerComponent");
let make = _children => {
...component,
initialState: () => 1,
@venil7
venil7 / pairs.js
Created August 29, 2018 19:01
pairs of array that sum to X, O(n)
let pairs = (arr: number[], s: number): number[][] => {
let cache = {};
let res = [];
for (let i of arr) {
if (!cache[i]) {
cache[i] = true;
}
let snd = s - i;
if (cache[snd]) {
res.push([i, snd]);
@venil7
venil7 / merge_sorted.ts
Created August 29, 2018 20:05
merge two sorted arrays O(n)
const merge = (a: number[], b: number[]): number[] => {
let length = a.length + b.length;
let result = Array(length);
let i = 0, j = 0, k = 0;
while (i < a.length && j < b.length) {
if (a[i] < b[j]) {
result[k] = a[i];
i += 1;
} else if (a[i] > b[j]) {
result[k] = b[j]
@venil7
venil7 / useThunk.js
Created November 30, 2018 11:23
Using thunk with React hooks
const useThunk = (reducer, initState) => {
const [state, dispatch] = useReducer(reducer, initState);
const thunkDispatch = action => {
if (typeof action === "function") {
action(dispatch, () => state);
} else {
dispatch(action);
}
};
return [state, thunkDispatch];
@venil7
venil7 / useMiddleware.js
Created November 30, 2018 13:24
Use redux middle with React hooks
const useMiddleware = (middlewares, reducer, initState) => {
const [state, dispatch] = useReducer(reducer, initState);
const getStore = () => ({ dispatch, getState: () => state });
const store = applyMiddleware(...middlewares)(getStore)();
const { dispatch: dispatch_, getState } = store;
return [getState(), dispatch_];
};
@venil7
venil7 / lense.ts
Last active May 24, 2020 11:08
Functional Lense implementation in TypeScript
type LGetter<LFrom, LTo> = (f: LFrom) => LTo;
type LSetter<LFrom, LTo> = (t: LTo, f: LFrom) => LFrom;
type LUpdater<T> = ((t: T) => T);
type LModifier<LFrom, LTo> = (u: LUpdater<LTo>) => (f: LFrom) => LFrom;
class Lense<LFrom, LTo> {
constructor(private get: LGetter<LFrom, LTo>, private set: LSetter<LFrom, LTo>) { }
public compose<LTo2>(inner: Lense<LTo, LTo2>): Lense<LFrom, LTo2> {
const _get: LGetter<LFrom, LTo2> = (f: LFrom) => inner.get(this.get(f));
const _set: LSetter<LFrom, LTo2> = (t2: LTo2, f: LFrom) => this.set(inner.set(t2, this.get(f)), f);
@venil7
venil7 / redux-observable.js
Created March 14, 2019 21:27
a quick implementation of redux-obesrvable middleware
import { Subject } from "rxjs";
export const createMiddleware = () => {
const [action$, state$] = [new Subject(), new Subject()];
const middleware = store => {
return dispatch => {
middleware.run = epic => epic(action$, state$).subscribe(store.dispatch);
return action => {
const result = dispatch(action);
action$.next(action);