├── .gitignore ├── .prettierrc ├── .travis.yml ├── .vscode └── settings.json ├── README.md ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.toptal.com/developers/gitignore/api/windows,macos,linux,node 3 | # Edit at https://www.toptal.com/developers/gitignore?templates=windows,macos,linux,node 4 | 5 | ### Linux ### 6 | *~ 7 | 8 | # temporary files which can be created if a process still has a handle open of a deleted file 9 | .fuse_hidden* 10 | 11 | # KDE directory preferences 12 | .directory 13 | 14 | # Linux trash folder which might appear on any partition or disk 15 | .Trash-* 16 | 17 | # .nfs files are created when an open file is removed but is still being accessed 18 | .nfs* 19 | 20 | ### macOS ### 21 | # General 22 | .DS_Store 23 | .AppleDouble 24 | .LSOverride 25 | 26 | # Icon must end with two \r 27 | Icon 28 | 29 | # Thumbnails 30 | ._* 31 | 32 | # Files that might appear in the root of a volume 33 | .DocumentRevisions-V100 34 | .fseventsd 35 | .Spotlight-V100 36 | .TemporaryItems 37 | .Trashes 38 | .VolumeIcon.icns 39 | .com.apple.timemachine.donotpresent 40 | 41 | # Directories potentially created on remote AFP share 42 | .AppleDB 43 | .AppleDesktop 44 | Network Trash Folder 45 | Temporary Items 46 | .apdisk 47 | 48 | ### Node ### 49 | # Logs 50 | logs 51 | *.log 52 | npm-debug.log* 53 | yarn-debug.log* 54 | yarn-error.log* 55 | lerna-debug.log* 56 | 57 | # Diagnostic reports (https://nodejs.org/api/report.html) 58 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 59 | 60 | # Runtime data 61 | pids 62 | *.pid 63 | *.seed 64 | *.pid.lock 65 | 66 | # Directory for instrumented libs generated by jscoverage/JSCover 67 | lib-cov 68 | 69 | # Coverage directory used by tools like istanbul 70 | coverage 71 | *.lcov 72 | 73 | # nyc test coverage 74 | .nyc_output 75 | 76 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 77 | .grunt 78 | 79 | # Bower dependency directory (https://bower.io/) 80 | bower_components 81 | 82 | # node-waf configuration 83 | .lock-wscript 84 | 85 | # Compiled binary addons (https://nodejs.org/api/addons.html) 86 | build/Release 87 | 88 | # Dependency directories 89 | node_modules/ 90 | jspm_packages/ 91 | 92 | # TypeScript v1 declaration files 93 | typings/ 94 | 95 | # TypeScript cache 96 | *.tsbuildinfo 97 | 98 | # Optional npm cache directory 99 | .npm 100 | 101 | # Optional eslint cache 102 | .eslintcache 103 | 104 | # Microbundle cache 105 | .rpt2_cache/ 106 | .rts2_cache_cjs/ 107 | .rts2_cache_es/ 108 | .rts2_cache_umd/ 109 | 110 | # Optional REPL history 111 | .node_repl_history 112 | 113 | # Output of 'npm pack' 114 | *.tgz 115 | 116 | # Yarn Integrity file 117 | .yarn-integrity 118 | 119 | # dotenv environment variables file 120 | .env 121 | .env.test 122 | 123 | # parcel-bundler cache (https://parceljs.org/) 124 | .cache 125 | 126 | # Next.js build output 127 | .next 128 | 129 | # Nuxt.js build / generate output 130 | .nuxt 131 | dist 132 | 133 | # Gatsby files 134 | .cache/ 135 | # Comment in the public line in if your project uses Gatsby and not Next.js 136 | # https://nextjs.org/blog/next-9-1#public-directory-support 137 | # public 138 | 139 | # vuepress build output 140 | .vuepress/dist 141 | 142 | # Serverless directories 143 | .serverless/ 144 | 145 | # FuseBox cache 146 | .fusebox/ 147 | 148 | # DynamoDB Local files 149 | .dynamodb/ 150 | 151 | # TernJS port file 152 | .tern-port 153 | 154 | # Stores VSCode versions used for testing VSCode extensions 155 | .vscode-test 156 | 157 | ### Windows ### 158 | # Windows thumbnail cache files 159 | Thumbs.db 160 | Thumbs.db:encryptable 161 | ehthumbs.db 162 | ehthumbs_vista.db 163 | 164 | # Dump file 165 | *.stackdump 166 | 167 | # Folder config file 168 | [Dd]esktop.ini 169 | 170 | # Recycle Bin used on file shares 171 | $RECYCLE.BIN/ 172 | 173 | # Windows Installer files 174 | *.cab 175 | *.msi 176 | *.msix 177 | *.msm 178 | *.msp 179 | 180 | # Windows shortcuts 181 | *.lnk 182 | 183 | # End of https://www.toptal.com/developers/gitignore/api/windows,macos,linux,node 184 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": false, 3 | "printWidth": 80, 4 | "tabWidth": 2, 5 | "singleQuote": true, 6 | "trailingComma": "all", 7 | "jsxBracketSameLine": false, 8 | "parser": "typescript", 9 | "semi": false, 10 | "arrowParens": "always" 11 | } 12 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 14 4 | script: literate-ts README.md 5 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "deno.enable": false 3 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FP-TS Cheatsheet 2 | 3 | ## Begin, Commit, Rollback 4 | 5 | 6 | ```ts 7 | import { pipe } from 'fp-ts/lib/function' 8 | import * as TE from 'fp-ts/lib/TaskEither' 9 | 10 | declare function begin(): Promise 11 | declare function commit(): Promise 12 | declare function rollback(): Promise 13 | 14 | pipe( 15 | TE.bracket( 16 | TE.tryCatch( 17 | () => begin(), 18 | (err) => new Error(`begin txn failed: ${err}`), 19 | ), 20 | () => 21 | TE.tryCatch( 22 | () => commit(), 23 | (err) => new Error(`commit txn failed: ${err}`), 24 | ), 25 | (_, either) => 26 | pipe( 27 | either, 28 | TE.fromEither, 29 | TE.orElse(() => 30 | TE.tryCatch( 31 | () => rollback(), 32 | (err) => new Error(`rollback txn failed: ${err}`), 33 | ), 34 | ), 35 | ), 36 | ), 37 | ) 38 | ``` 39 | 40 | ## Convert Multiple Eithers into a Single Either 41 | 42 | 43 | ```ts 44 | import * as E from 'fp-ts/lib/Either' 45 | import { sequenceS, sequenceT } from 'fp-ts/lib/Apply' 46 | 47 | declare function func1(): E.Either 48 | declare function func2(): E.Either 49 | declare function func3(): E.Either 50 | 51 | // Produces an Object { a: number., b: string, c: object } 52 | sequenceS(E.either)({ 53 | a: func1(), 54 | b: func2(), 55 | c: func3(), 56 | }) 57 | 58 | // Produces a Tuple [number, string, object] 59 | sequenceT(E.either)(func1(), func2(), func3()) 60 | ``` 61 | 62 | ## Check for Errors in an Array 63 | 64 | 65 | ```ts 66 | import * as A from 'fp-ts/lib/Array' 67 | import * as E from 'fp-ts/lib/Either' 68 | import { sequenceS, sequenceT } from 'fp-ts/lib/Apply' 69 | 70 | const arr = [1,2,3] 71 | 72 | // Type signature is E.Either 73 | A.array.traverse(E.either)(arr, (val) => { 74 | if (val === 2) { 75 | return E.left(new Error('2 is invalid')) 76 | } 77 | 78 | return E.right(val) 79 | }) 80 | ``` 81 | 82 | ## Handle a TaskEither Error with another TaskEither 83 | 84 | 85 | ```ts 86 | import { pipe } from 'fp-ts/lib/function' 87 | import { IOEither } from 'fp-ts/lib/IOEither' 88 | import { 89 | swap, 90 | TaskEither, 91 | chainFirstW, 92 | fromIOEither, 93 | chain, 94 | } from 'fp-ts/lib/TaskEither' 95 | 96 | declare const log: (message: string, err?: Error) => IOEither 97 | 98 | declare const foo: TaskEither 99 | 100 | const handleError = (fe: (e: E) => TaskEither) => ( 101 | te: TaskEither, 102 | ) => { 103 | return pipe( 104 | // 1. Put the error on the right side of the railway 105 | swap(te), 106 | // 2. Perform an action on the error, if there is one 107 | chainFirstW(fe), 108 | // 3. Put the error back on the left side 109 | swap, 110 | // 4. Place the original TaskEither back on the railway 111 | chain(() => te), 112 | ) 113 | } 114 | 115 | pipe( 116 | foo, 117 | handleError((err) => pipe(log('Execution failed', err), fromIOEither)), 118 | ) // TaskEither 119 | ``` 120 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fp-ts-cheatsheets", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/node": { 8 | "version": "14.0.23", 9 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.23.tgz", 10 | "integrity": "sha512-Z4U8yDAl5TFkmYsZdFPdjeMa57NOvnaf1tljHzhouaPEp7LCj2JKkejpI1ODviIAQuW4CcQmxkQ77rnLsOOoKw==", 11 | "dev": true 12 | }, 13 | "ansi-regex": { 14 | "version": "4.1.0", 15 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 16 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 17 | "dev": true 18 | }, 19 | "ansi-styles": { 20 | "version": "3.2.1", 21 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 22 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 23 | "dev": true, 24 | "requires": { 25 | "color-convert": "^1.9.0" 26 | } 27 | }, 28 | "balanced-match": { 29 | "version": "1.0.0", 30 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 31 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 32 | "dev": true 33 | }, 34 | "brace-expansion": { 35 | "version": "1.1.11", 36 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 37 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 38 | "dev": true, 39 | "requires": { 40 | "balanced-match": "^1.0.0", 41 | "concat-map": "0.0.1" 42 | } 43 | }, 44 | "camelcase": { 45 | "version": "5.3.1", 46 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 47 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 48 | "dev": true 49 | }, 50 | "chalk": { 51 | "version": "2.4.2", 52 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 53 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 54 | "dev": true, 55 | "requires": { 56 | "ansi-styles": "^3.2.1", 57 | "escape-string-regexp": "^1.0.5", 58 | "supports-color": "^5.3.0" 59 | } 60 | }, 61 | "cli-cursor": { 62 | "version": "2.1.0", 63 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 64 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 65 | "dev": true, 66 | "requires": { 67 | "restore-cursor": "^2.0.0" 68 | } 69 | }, 70 | "cli-spinners": { 71 | "version": "2.3.0", 72 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.3.0.tgz", 73 | "integrity": "sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w==", 74 | "dev": true 75 | }, 76 | "cliui": { 77 | "version": "5.0.0", 78 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 79 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 80 | "dev": true, 81 | "requires": { 82 | "string-width": "^3.1.0", 83 | "strip-ansi": "^5.2.0", 84 | "wrap-ansi": "^5.1.0" 85 | } 86 | }, 87 | "clone": { 88 | "version": "1.0.4", 89 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 90 | "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", 91 | "dev": true 92 | }, 93 | "color-convert": { 94 | "version": "1.9.3", 95 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 96 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 97 | "dev": true, 98 | "requires": { 99 | "color-name": "1.1.3" 100 | } 101 | }, 102 | "color-name": { 103 | "version": "1.1.3", 104 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 105 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 106 | "dev": true 107 | }, 108 | "concat-map": { 109 | "version": "0.0.1", 110 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 111 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 112 | "dev": true 113 | }, 114 | "decamelize": { 115 | "version": "1.2.0", 116 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 117 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 118 | "dev": true 119 | }, 120 | "defaults": { 121 | "version": "1.0.3", 122 | "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", 123 | "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", 124 | "dev": true, 125 | "requires": { 126 | "clone": "^1.0.2" 127 | } 128 | }, 129 | "emoji-regex": { 130 | "version": "7.0.3", 131 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 132 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 133 | "dev": true 134 | }, 135 | "escape-string-regexp": { 136 | "version": "1.0.5", 137 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 138 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 139 | "dev": true 140 | }, 141 | "find-up": { 142 | "version": "3.0.0", 143 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 144 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 145 | "dev": true, 146 | "requires": { 147 | "locate-path": "^3.0.0" 148 | } 149 | }, 150 | "fp-ts": { 151 | "version": "2.8.6", 152 | "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.8.6.tgz", 153 | "integrity": "sha512-fGGpKf/Jy3UT4s16oM+hr/8F5QXFcZ+20NAvaZXH5Y5jsiLPMDCaNqffXq0z1Kr6ZUJj0346cH9tq+cI2SoJ4w==", 154 | "dev": true 155 | }, 156 | "fs-extra": { 157 | "version": "8.1.0", 158 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 159 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 160 | "dev": true, 161 | "requires": { 162 | "graceful-fs": "^4.2.0", 163 | "jsonfile": "^4.0.0", 164 | "universalify": "^0.1.0" 165 | } 166 | }, 167 | "fs.realpath": { 168 | "version": "1.0.0", 169 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 170 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 171 | "dev": true 172 | }, 173 | "get-caller-file": { 174 | "version": "2.0.5", 175 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 176 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 177 | "dev": true 178 | }, 179 | "glob": { 180 | "version": "7.1.6", 181 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 182 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 183 | "dev": true, 184 | "requires": { 185 | "fs.realpath": "^1.0.0", 186 | "inflight": "^1.0.4", 187 | "inherits": "2", 188 | "minimatch": "^3.0.4", 189 | "once": "^1.3.0", 190 | "path-is-absolute": "^1.0.0" 191 | } 192 | }, 193 | "graceful-fs": { 194 | "version": "4.2.4", 195 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 196 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", 197 | "dev": true 198 | }, 199 | "has-flag": { 200 | "version": "3.0.0", 201 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 202 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 203 | "dev": true 204 | }, 205 | "inflight": { 206 | "version": "1.0.6", 207 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 208 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 209 | "dev": true, 210 | "requires": { 211 | "once": "^1.3.0", 212 | "wrappy": "1" 213 | } 214 | }, 215 | "inherits": { 216 | "version": "2.0.4", 217 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 218 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 219 | "dev": true 220 | }, 221 | "is-fullwidth-code-point": { 222 | "version": "2.0.0", 223 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 224 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 225 | "dev": true 226 | }, 227 | "jsonfile": { 228 | "version": "4.0.0", 229 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 230 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 231 | "dev": true, 232 | "requires": { 233 | "graceful-fs": "^4.1.6" 234 | } 235 | }, 236 | "literate-ts": { 237 | "version": "1.1.1", 238 | "resolved": "https://registry.npmjs.org/literate-ts/-/literate-ts-1.1.1.tgz", 239 | "integrity": "sha512-XNxCLYtuAoSLfHgLNCIPr9NvDM7+mKwzdgBzSlov9I4ocv1oZms7eYBnPeXoQNSAwMR6VJMjGjy0ZG8FUShH5g==", 240 | "dev": true, 241 | "requires": { 242 | "chalk": "^2.4.2", 243 | "fs-extra": "^8.1.0", 244 | "glob": "^7.1.4", 245 | "lodash": "^4.17.15", 246 | "ora": "^3.4.0", 247 | "tmp": "^0.1.0", 248 | "yargs": "^14.0.0" 249 | } 250 | }, 251 | "locate-path": { 252 | "version": "3.0.0", 253 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 254 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 255 | "dev": true, 256 | "requires": { 257 | "p-locate": "^3.0.0", 258 | "path-exists": "^3.0.0" 259 | } 260 | }, 261 | "lodash": { 262 | "version": "4.17.19", 263 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", 264 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", 265 | "dev": true 266 | }, 267 | "log-symbols": { 268 | "version": "2.2.0", 269 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", 270 | "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", 271 | "dev": true, 272 | "requires": { 273 | "chalk": "^2.0.1" 274 | } 275 | }, 276 | "mimic-fn": { 277 | "version": "1.2.0", 278 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 279 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 280 | "dev": true 281 | }, 282 | "minimatch": { 283 | "version": "3.0.4", 284 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 285 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 286 | "dev": true, 287 | "requires": { 288 | "brace-expansion": "^1.1.7" 289 | } 290 | }, 291 | "once": { 292 | "version": "1.4.0", 293 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 294 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 295 | "dev": true, 296 | "requires": { 297 | "wrappy": "1" 298 | } 299 | }, 300 | "onetime": { 301 | "version": "2.0.1", 302 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 303 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 304 | "dev": true, 305 | "requires": { 306 | "mimic-fn": "^1.0.0" 307 | } 308 | }, 309 | "ora": { 310 | "version": "3.4.0", 311 | "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", 312 | "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", 313 | "dev": true, 314 | "requires": { 315 | "chalk": "^2.4.2", 316 | "cli-cursor": "^2.1.0", 317 | "cli-spinners": "^2.0.0", 318 | "log-symbols": "^2.2.0", 319 | "strip-ansi": "^5.2.0", 320 | "wcwidth": "^1.0.1" 321 | } 322 | }, 323 | "p-limit": { 324 | "version": "2.3.0", 325 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 326 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 327 | "dev": true, 328 | "requires": { 329 | "p-try": "^2.0.0" 330 | } 331 | }, 332 | "p-locate": { 333 | "version": "3.0.0", 334 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 335 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 336 | "dev": true, 337 | "requires": { 338 | "p-limit": "^2.0.0" 339 | } 340 | }, 341 | "p-try": { 342 | "version": "2.2.0", 343 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 344 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 345 | "dev": true 346 | }, 347 | "path-exists": { 348 | "version": "3.0.0", 349 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 350 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 351 | "dev": true 352 | }, 353 | "path-is-absolute": { 354 | "version": "1.0.1", 355 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 356 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 357 | "dev": true 358 | }, 359 | "require-directory": { 360 | "version": "2.1.1", 361 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 362 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 363 | "dev": true 364 | }, 365 | "require-main-filename": { 366 | "version": "2.0.0", 367 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 368 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 369 | "dev": true 370 | }, 371 | "restore-cursor": { 372 | "version": "2.0.0", 373 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 374 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 375 | "dev": true, 376 | "requires": { 377 | "onetime": "^2.0.0", 378 | "signal-exit": "^3.0.2" 379 | } 380 | }, 381 | "rimraf": { 382 | "version": "2.7.1", 383 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 384 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 385 | "dev": true, 386 | "requires": { 387 | "glob": "^7.1.3" 388 | } 389 | }, 390 | "set-blocking": { 391 | "version": "2.0.0", 392 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 393 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 394 | "dev": true 395 | }, 396 | "signal-exit": { 397 | "version": "3.0.3", 398 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 399 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 400 | "dev": true 401 | }, 402 | "string-width": { 403 | "version": "3.1.0", 404 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 405 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 406 | "dev": true, 407 | "requires": { 408 | "emoji-regex": "^7.0.1", 409 | "is-fullwidth-code-point": "^2.0.0", 410 | "strip-ansi": "^5.1.0" 411 | } 412 | }, 413 | "strip-ansi": { 414 | "version": "5.2.0", 415 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 416 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 417 | "dev": true, 418 | "requires": { 419 | "ansi-regex": "^4.1.0" 420 | } 421 | }, 422 | "supports-color": { 423 | "version": "5.5.0", 424 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 425 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 426 | "dev": true, 427 | "requires": { 428 | "has-flag": "^3.0.0" 429 | } 430 | }, 431 | "tmp": { 432 | "version": "0.1.0", 433 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", 434 | "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", 435 | "dev": true, 436 | "requires": { 437 | "rimraf": "^2.6.3" 438 | } 439 | }, 440 | "typescript": { 441 | "version": "3.9.7", 442 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", 443 | "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", 444 | "dev": true 445 | }, 446 | "universalify": { 447 | "version": "0.1.2", 448 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 449 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 450 | "dev": true 451 | }, 452 | "wcwidth": { 453 | "version": "1.0.1", 454 | "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", 455 | "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", 456 | "dev": true, 457 | "requires": { 458 | "defaults": "^1.0.3" 459 | } 460 | }, 461 | "which-module": { 462 | "version": "2.0.0", 463 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 464 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 465 | "dev": true 466 | }, 467 | "wrap-ansi": { 468 | "version": "5.1.0", 469 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 470 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 471 | "dev": true, 472 | "requires": { 473 | "ansi-styles": "^3.2.0", 474 | "string-width": "^3.0.0", 475 | "strip-ansi": "^5.0.0" 476 | } 477 | }, 478 | "wrappy": { 479 | "version": "1.0.2", 480 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 481 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 482 | "dev": true 483 | }, 484 | "y18n": { 485 | "version": "4.0.0", 486 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 487 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 488 | "dev": true 489 | }, 490 | "yargs": { 491 | "version": "14.2.3", 492 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", 493 | "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", 494 | "dev": true, 495 | "requires": { 496 | "cliui": "^5.0.0", 497 | "decamelize": "^1.2.0", 498 | "find-up": "^3.0.0", 499 | "get-caller-file": "^2.0.1", 500 | "require-directory": "^2.1.1", 501 | "require-main-filename": "^2.0.0", 502 | "set-blocking": "^2.0.0", 503 | "string-width": "^3.0.0", 504 | "which-module": "^2.0.0", 505 | "y18n": "^4.0.0", 506 | "yargs-parser": "^15.0.1" 507 | } 508 | }, 509 | "yargs-parser": { 510 | "version": "15.0.1", 511 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", 512 | "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", 513 | "dev": true, 514 | "requires": { 515 | "camelcase": "^5.0.0", 516 | "decamelize": "^1.2.0" 517 | } 518 | } 519 | } 520 | } 521 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fp-ts-cheatsheets", 3 | "version": "1.0.0", 4 | "description": "## Option", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/ryanleecode/fp-ts-cheatsheets.git" 12 | }, 13 | "author": "", 14 | "license": "ISC", 15 | "bugs": { 16 | "url": "https://github.com/ryanleecode/fp-ts-cheatsheets/issues" 17 | }, 18 | "homepage": "https://github.com/ryanleecode/fp-ts-cheatsheets#readme", 19 | "devDependencies": { 20 | "@types/node": "^14.0.23", 21 | "fp-ts": "^2.8.6", 22 | "literate-ts": "^1.1.1", 23 | "typescript": "^3.9.7" 24 | } 25 | } 26 | --------------------------------------------------------------------------------