{"_id":"@dudousxd/monad_ts","_rev":"3-284b028cfec72826c2fdfd0cc5c8ed98","name":"@dudousxd/monad_ts","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@dudousxd/monad_ts","version":"1.0.0","main":"src/index.js","license":"MIT","repository":{"type":"git","url":"git+https://github.com/DavideCarvalho/monad.ts.git"},"bugs":{"url":"https://github.com/DavideCarvalho/monad.ts/issues"},"author":{"name":"Davi de Carvalho","email":"davi_carvalho96@hotmail.com","url":"https://github.com/DavideCarvalho"},"scripts":{"test":"nyc node_modules/.bin/mocha","test:coverage":"nyc node_modules/.bin/mocha && node_modules/.bin/nyc report --reporter=text"},"devDependencies":{"@types/chai":"^4.1.2","@types/mocha":"^5.0.0","chai":"^4.1.2","jest":"^22.4.3","mocha":"^5.0.5","nyc":"^11.6.0","source-map-support":"^0.5.4","ts-jest":"^22.4.2","ts-node":"^5.0.1","typings":"^2.1.1"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","coverage/**","**/*.test.ts"],"reporter":["html"],"all":true},"gitHead":"59601da66f4896a2de37b486768aee27fca6ce01","description":"> Monad Structure for TypeScript","homepage":"https://github.com/DavideCarvalho/monad.ts#readme","_id":"@dudousxd/monad_ts@1.0.0","_npmVersion":"5.8.0","_nodeVersion":"8.9.3","_npmUser":{"name":"dudousxd","email":"davi_carvalho96@hotmail.com"},"dist":{"integrity":"sha512-qLSgFjNbtrsOs5l1PlmzuyJRTvh/Mfg9ja2GTPMsM6EEVNv4zJZxB0pNtlQT0ofuKWN5fQ+Ia5AGYMCe03vjnQ==","shasum":"795473db17ae97001845a8cddf52ba3e28b341a6","tarball":"https://registry.npmjs.org/@dudousxd/monad_ts/-/monad_ts-1.0.0.tgz","fileCount":16,"unpackedSize":336911,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAa2tLYlFZWbtDiads9TCk3gF3dRdEmJ+nR3es63EwNWAiEAgy1J+DCv+vbjTsj/sB3pmYqC0oirJx5lupK/ByJCU50="}]},"maintainers":[{"name":"dudousxd","email":"davi_carvalho96@hotmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/monad_ts_1.0.0_1522263270716_0.266596191536584"},"_hasShrinkwrap":false,"deprecated":"this package is deprecated"}},"time":{"created":"2018-03-28T18:54:30.660Z","1.0.0":"2018-03-28T18:54:30.818Z","modified":"2022-04-05T06:07:04.854Z"},"maintainers":[{"name":"dudousxd","email":"davi_carvalho96@hotmail.com"}],"description":"> Monad Structure for TypeScript","homepage":"https://github.com/DavideCarvalho/monad.ts#readme","repository":{"type":"git","url":"git+https://github.com/DavideCarvalho/monad.ts.git"},"author":{"name":"Davi de Carvalho","email":"davi_carvalho96@hotmail.com","url":"https://github.com/DavideCarvalho"},"bugs":{"url":"https://github.com/DavideCarvalho/monad.ts/issues"},"license":"MIT","readme":"# monad.ts\r\n> Monad Structure for TypeScript\r\n\r\nMonad.ts is a lib capable of giving to TypeScript the ability of having safe IO.\r\nIf you don't know what a monad is, I recommend you to [read about it.](https://medium.com/javascript-scene/javascript-monads-made-simple-7856be57bfe8)\r\n\r\nUse this lib is quite simple! You only need to import Monad and encapsulate your object inside it.\r\n\r\n```typescript\r\nimport Monad from 'MonadTs';\r\nconst myMonad: Monad<string> = Monad.of('Hello World');\r\n```\r\n\r\nWhen encapsulated, you have some methods to make operations on your monad.\r\n\r\n### ```bind(fn(x: any) => any): Monad<T>```\r\n\r\nThis method takes a function as argument and returns a new Monad with your desired type.\r\n\r\n```typescript\r\nconst myMonad: Monad<number[]> = Monad.of([1, 2, 3, 4, 5]);\r\nconst f = (x: number) => x + 1;\r\nconst mappedMonad: Monad<number[]> = myMonad.bind(f);\r\nconsole.log(mappedMonad.value) // [2, 3, 4, 5 , 6]\r\n```\r\n\r\nSince this method returns another Monad, you can chain methods like this:\r\n```typescript\r\nconst myMonad: Monad<number[]> = Monad.of([1, 2, 3, 4, 5]);\r\nconst f = (x: number) => x + 1;\r\nconst g = (x: number) => x * 2;\r\nconst mappedMonad: Monad<number[]> = myMonad.bind(f).bind(g);\r\nconsole.log(mappedMonad.value) //[4, 6, 8, 10, 12]\r\n```\r\n\r\nAnd of course, you can change the type of your Monad based on your operations\r\n```typescript\r\nconst myMonad: Monad<number> = Monad.of(1);\r\nconst f = (x: number): string => x.toString();\r\nconst mappedMonad: Monad<string> = myMonad.bind(f);\r\nconsole.log(typeof mappedMonad.value) //string\r\n```\r\n\r\n### ```flatMap(fn(x: any) => any): Monad<T>```\r\nAs you can see, bind and flatMap receives and returns the same stuff, there is only one little diference between them: While map\r\noperates in a single object (like an array of objects), flatMap can take several values (like an array of arrays), join them in a \r\nsingle object and then operate, e.g:\r\n\r\n```typescript\r\nconst myMonad: Monad<number[][]> = Monad.of([[1], [2, 3], [4, 5, 6]]);\r\nconst f = (x: number) => x + 1;\r\nconst mappedMonad: Monad<number[]> = myMonad.flatMap(f);\r\nconsole.log(mappedMonad.value) //[2, 3, 4, 5, 6, 7]\r\n```\r\n\r\nIf your array has any empty array, it will be unnoticed\r\n```typescript\r\nconst myMonad: Monad<number[][]> = Monad.of([[1], [], [4, 5, 6]]);\r\nconst f = (x: number) => x + 1;\r\nconst mappedMonad: Monad<number[]> = myMonad.flatMap(f);\r\nconsole.log(mappedMonad.value); // [2, 5, 6, 7]\r\n```\r\n\r\nAaand we can't forget, you can chain flatMap with map\r\n```typescript\r\nconst myMonad: Monad<number[][]> = Monad.of([[1], [], [4, 5, 6]]);\r\nconst f = (x: number) => x + 1;\r\nconst g = (x: number) => x * 2;\r\nconst mappedMonad: Monad<number[]> = myMonad.flatMap(f).bind(g);\r\nconsole.log(mappedMonad.value); // [4, 6, 8, 10, 12, 14]\r\n```\r\n","readmeFilename":"README.md"}