Skip to content

Instantly share code, notes, and snippets.

View dewey92's full-sized avatar
🌴

Jihad D. Waspada dewey92

🌴
View GitHub Profile
@dewey92
dewey92 / readerMonad.ts
Last active April 23, 2018 13:37
My Reader Monad Impl
interface Reader<D, A> {
(deps: D): A
}
const fmap = <D, A, B>(f: (v: A) => B, readerA: Reader<D, A>): Reader<D, B> =>
deps => f(readerA(deps))
const bind = <D, A, B>(f: (v: A) => Reader<D, B>, readerA: Reader<D, A>): Reader<D, B> =>
deps => f(readerA(deps))(deps)
@dewey92
dewey92 / readerMonadOop.ts
Last active April 25, 2018 20:03
My Reader Monad Oop Impl
interface IReader<D, A> {
map<B>(f: (value: A) => B): IReader<D, B>,
flatMap<B>(f: (value: A) => IReader<D, B>): IReader<D, B>,
run(deps: D): A
}
const Reader = <D, A>(fn: (deps: D) => A): IReader<D, A> => {
const run = (deps: D) => fn(deps);
return {
map: f => Reader((deps: D) => f(run(deps))),
@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
@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 / 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 / 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 / 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 / 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 / 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 / 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),