Skip to content

Instantly share code, notes, and snippets.

View freddi301's full-sized avatar

Frederik Batuna freddi301

View GitHub Profile
@freddi301
freddi301 / function-composition.ts
Created March 5, 2019 16:51
TypeScript function composition
function pipe<A, B>(f: (a: A) => B) {
return {
end: f,
pipe<C>(g: (b: B) => C) {
return pipe((a: A) => g(f(a)));
}
};
}
function compose<A, B>(f: (a: A) => B) {
@freddi301
freddi301 / tagged-union-pattern-match.ts
Created January 16, 2019 15:24
TypeScript taggedUnion pattern match
class TaggedUnionValue<
TaggedUnion extends { [K in keyof TaggedUnion]: any[] },
Tag extends keyof TaggedUnion
> {
constructor(
private readonly tag: Tag,
private readonly value: TaggedUnion[Tag],
) {}
}
@freddi301
freddi301 / Promise.js
Created January 9, 2019 10:58
naive javascript promise
const status = Symbol();
const value = Symbol();
const set = Symbol();
const listeners = Symbol();
class Promise {
constructor(callback) {
this[listeners] = [];
this[status] = "pending";
const resolve = value => {
@freddi301
freddi301 / I18n.tsx
Created January 4, 2019 16:27
React TypeScript i18n
import React from "react";
type Dictionary = Record<string, string | ((arg: any) => string)>;
export type L12n<T extends Dictionary> = T;
export function makeI18n<T extends Dictionary>() {
const Context = React.createContext<T | undefined>(undefined);
const I18ContextConsumer = Context.Consumer;
const I18ContextProvider = Context.Provider;
function I18n<K extends keyof T>(
@freddi301
freddi301 / ts-ql.ts
Last active January 7, 2019 22:43
grapql in typescript
type DataTypeUnion = ObjectType<any> | ArrayType<any> | PrimitiveTypeUnion;
type PrimitiveTypeUnion = typeof string | typeof number | typeof boolean;
interface QueryType<
Params extends { [key: string]: PrimitiveTypeUnion },
T extends DataTypeUnion
> {
kind: "query";
params: Params;
@freddi301
freddi301 / frontend-architecture.txt
Last active November 27, 2018 12:58
Frontend Architecture
view:
component: composition of
helper: prepare data for template so no code goes into the tempalte
template: does only view, can dispatch events
container: composition of
injector: grabs data from state
wireframe: conecptual representation of ui, it's a projections of data to display and possible actions
domain:
@freddi301
freddi301 / WindowResizeListener.ts
Created August 10, 2018 15:13
Responsive React Component
import * as React from "react";
type Pixels = number;
interface Params {
width: Pixels;
height: Pixels;
}
export class WindowResizeListener extends React.Component<
@freddi301
freddi301 / FAQ.md
Last active August 9, 2018 08:47
Liferay 6.2

If new version of classes of service builder i deployed and doesn't match the version saved on database, it's needed to to delete a row from table servicecomponent where buildernamespace=

If namespace isolation is required, use <portlet:namespace /> in *.jsp file. Example:

@freddi301
freddi301 / reduce-boilerplate.ts
Last active June 21, 2021 04:10
TypeScript Redux reduce boilerplate
export interface ActionHandler<State, Payload> {
(state: State, payload: Payload): State;
}
export interface ActionHandlers<State> {
[index: string]: ActionHandler<State, any>;
}
export interface Action<Type, Payload> {
type: Type;
payload: Payload;
@freddi301
freddi301 / ParameterType.ts
Last active September 14, 2018 11:35
TypeScript Utility Types
export type Parameter1Type<Fun extends (...parameters: any[]) => any> = Fun extends (parameter1: infer Parameter1, ...parameters: any[]) => any ? Parameter1 : never;
export type Parameter2Type<Fun extends (...parameters: any[]) => any> = Fun extends (parameter1: any, parameter2: infer Parameter2, ...parameters: any[]) => any ? Parameter2 : never;
export type Parameter3Type<Fun extends (...parameters: any[]) => any> = Fun extends (parameter1: any, parameter2: any, parameter3: infer Parameter3, ...parameters: any[]) => any ? Parameter3 : never;
export type Parameter4Type<Fun extends (...parameters: any[]) => any> = Fun extends (parameter1: any, parameter2: any, parameter3: any, parameter4: infer Parameter4, ...parameters: any[]) => any ? Parameter4 : never;
export type Parameter5Type<Fun extends (...parameters: any[]) => any> = Fun extends (parameter1: any, parameter2: any, parameter3: any, parameter4: any, parameter5: infer Parameter5, ...parameters: any[]) => any ? Parameter5 : never;
export type Parameter6Ty