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 | |
| } | |
| 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) |
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 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))), |
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 |
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 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
| 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
| 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
| 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
| 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
| 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), |