Skip to content

Instantly share code, notes, and snippets.

View dewey92's full-sized avatar
🌴

Jihad D. Waspada dewey92

🌴
View GitHub Profile
@dewey92
dewey92 / readerComposition.ts
Last active April 26, 2018 22:43
Reader composition
interface User {
id: number,
name: string,
managerId: number,
}
// ambil dependency
const userRepo = (deps: Deps) => deps.userRepo; // Reader<Deps, UserRepository>
const logger = (deps: Deps) => deps.logger; // Reader<Deps, Logger>
interface UserRepository {...}
interface Logger {...}
interface Deps {
userRepo: UserRepository,
logger: Logger
}
@dewey92
dewey92 / transaksiBambangReader.ts
Last active April 26, 2018 21:21
Menggunakan Reader
const accRepo: AccountRepo = {
find: no => ({ name: 'Bambang', email: 'tampan@tampan.com' })
};
declare function debit(no: string, amount: number): Reader<AccountRepo, Account>;
declare function credit(no: string, amount: number): Reader<AccountRepo, Account>;
declare function balance(no: string): Reader<AccountRepo, number>;
const transaksiBambangF = (no: string) => composeK(
() => balance(no),
@dewey92
dewey92 / transaksiBambang.ts
Last active April 26, 2018 22:38
Transaksi Bambang
interface Account {
name: string,
email: string,
}
interface AccountRepo {
find: (no: string) => Account
}
const accRepo: AccountRepo = {
@dewey92
dewey92 / bindReader.ts
Created April 23, 2018 13:27
Bind Reader
interface Reader<D, A> {
(deps: D): A
}
// Hindley-Milner style:
// Reader d a = d -> a
const bind = <D, A, B>(f: (v: A) => Reader<D, B>, readerA: Reader<D, A>): Reader<D, B> =>
deps => f(readerA(deps))(deps)
// ES6:
// const bind = (f, reader) => deps => f(reader(deps))(deps)
@dewey92
dewey92 / bind.ts
Last active April 25, 2018 07:26
Bind Reader
bind<A, B>(f: (v: A) => Functor<B>, functorA: Functor<A>): Functor<B>
// for Reader, it should be
bind<D, A, B>(f: (v: A) => Reader<D, B>, readerA: Reader<D, A>): Reader<D, B>
// Hindley-Milner style
// bind :: (a -> f b) -> f a -> f b
// bind :: (a -> Reader d b) -> Reader d a -> Reader d b
// karena (Reader d b) adalah (d -> b), maka
// bind :: (a -> d -> b) -> (d -> a) -> (d -> b)
@dewey92
dewey92 / fmap.ts
Last active April 23, 2018 11:40
Functor Map
fmap<A, B>(f: (v: A) => B, functorA: Functor<A>): Functor<B>
// for Reader, it should be
fmap<D, A, B>(f: (v: A) => B, readerA: Reader<D, A>): Reader<D, B>
// Hindley-Milner style
// fmap :: Functor f => (a -> b) -> f a -> f b
// fmap :: (a -> b) -> Reader d a -> Reader d b
// fmap :: (a -> b) -> (d -> a) -> (d -> b)
@dewey92
dewey92 / mapReader.ts
Last active April 23, 2018 13:28
Map Reader
interface Reader<D, A> {
(deps: D): A
}
// Hindley-Milner style:
// Reader d a = d -> a
const fmap = <D, A, B>(f: (v: A) => B, readerA: Reader<D, A>): Reader<D, B> =>
deps => f(readerA(deps))
// ES6:
@dewey92
dewey92 / readerInterface.ts
Last active April 23, 2018 11:33
Reader Interface
interface Reader<D, A> {
(deps: D): A
}
// Hindley-Milner style:
// Reader d a = d -> a
@dewey92
dewey92 / example-reader.ts
Created April 22, 2018 21:55
Reader example (TODO: improve simplicity)
interface User {
name: string
}
const generateId = () => (Math.random() * 10).toString();
const depsTest = {
env: 'testing',
db: {
selectAll: (tableName: string) => [],
select: (x: { id: string, name: string }) => x, // do nothing