This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| interface UserRepository {...} | |
| interface Logger {...} | |
| interface Deps { | |
| userRepo: UserRepository, | |
| logger: Logger | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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), |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| interface Account { | |
| name: string, | |
| email: string, | |
| } | |
| interface AccountRepo { | |
| find: (no: string) => Account | |
| } | |
| const accRepo: AccountRepo = { |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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: |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| interface Reader<D, A> { | |
| (deps: D): A | |
| } | |
| // Hindley-Milner style: | |
| // Reader d a = d -> a |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |