Last active
October 27, 2022 16:21
-
-
Save deepakshrma/78b8a14940b17ffaff159d3188754597 to your computer and use it in GitHub Desktop.
Functional Programming In JavaScript-TypeScript for Beginners
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
| function calculateInterest(p: number, t: number, r: number) { | |
| return (p * t * r) / 100; | |
| } | |
| console.log(calculateInterest(1000, 5, 5)); | |
| //250 |
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
| def calculateInterest(p: float, t: int, r: float): | |
| return (p * t * r) / 100 | |
| print(calculateInterest(1000, 5, 5)) | |
| ## Output: 250 |
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
| def twoSum(nums, target): | |
| num_map = {} | |
| for i in range(len(nums)): | |
| if nums[i] in num_map: | |
| return [num_map[nums[i]], i] | |
| else: | |
| num_map[target-nums[i]] = i | |
| print(twoSum([2, 7, 11, 15], 9)) |
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
| def is_real_number(num): | |
| return type(num) == int or type(num) == float | |
| def divide(num, den): | |
| if not(is_real_number(num) and is_real_number(den)): | |
| raise ValueError("Invalid argument") | |
| if den == 0: | |
| raise ValueError("Number is not divisible by zero") | |
| return num/den | |
| def add(*arg): | |
| if any([not(is_real_number(i)) for i in arg]): | |
| raise ValueError("Invalid argument") | |
| return sum(arg) | |
| print(divide(10, 2)) # 5.0 | |
| print(add(1, 2, 3)) # 6 | |
| print(divide("10", 2)) # ValueError: Invalid argument | |
| print(divide(10, 0)) # ValueError: Number is not divisible by zero |
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
| function trim(str: string) { | |
| return str.replace(/^\s+|\s+$/g, ""); | |
| } | |
| console.log(trim(" This text had extra spaces.. ")); | |
| // "This text had extra spaces.." |
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
| import re | |
| trimReg = re.compile(r"^\s+|\s+$", re.IGNORECASE) | |
| def trim(txt: str): | |
| return re.sub(trimReg, "", txt) | |
| print(trim(" This text had extra spaces.. ")) | |
| ## "This text had extra spaces.." |
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
| def twoSum(nums, target): | |
| num_map = {} | |
| for index, num in enumerate(nums): | |
| if num in num_map: | |
| return [num_map[num], index] | |
| else: | |
| num_map[target-num] = index |
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
| def greet(name): | |
| print(f"Welcome Mr/Ms. {name}") | |
| gr_8 = greet | |
| greet("Deepak") # Welcome Mr/Ms. Deepak | |
| gr_8("Deepak") # Welcome Mr/Ms. Deepak |
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
| enum GENDER { | |
| MR = "Mr.", | |
| MS = "Miss.", | |
| } | |
| function greeting(name: string, is: GENDER = GENDER.MR) { | |
| return `Hello, ${is == GENDER.MR ? GENDER.MR : GENDER.MS} ${name}`; | |
| } | |
| console.log(greeting("Deepak")); | |
| // "Hello, Mr. Deepak" |
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
| import re | |
| trimReg = re.compile(r"^\s+|\s+$", re.IGNORECASE) | |
| trim = lambda txt:re.sub(trimReg, "", txt) | |
| print(trim(" This text had extra spaces.. ")) | |
| ## "This text had extra spaces.." |
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
| nums = [1, 2, 3, 4, 5, 6] | |
| name = "123456" | |
| sslice = slice(1, 6, 2) | |
| print(nums[slice(1, 6)]) # [1, 2, 3, 4, 5, 6] | |
| print(nums[sslice]) # [2, 4, 6] | |
| print(name[sslice]) # 246 |
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
| def inc(x): | |
| return x + 1 | |
| def dec(x): | |
| return x - 1 | |
| def operate(func, x): | |
| result = func(x) | |
| return result | |
| operate(inc, 5) # 6 | |
| operate(dec, 5) # 4 |
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
| function rand(num = 4) { | |
| return Math.random().toString(16).substr(-num); | |
| } | |
| function uuid(): string { | |
| return [rand(8), rand(4), rand(4), rand(4), rand(12)].join("-"); | |
| } | |
| console.log(uuid()); |
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
| from enum import Enum | |
| class GENDER(Enum): | |
| MR = "Mr." | |
| MS = "Miss." | |
| def greeting( | |
| name: str, grt: GENDER = GENDER.MR): | |
| return f"Hello, {grt.value} {name}" | |
| print(greeting("Deepak")) | |
| print(greeting("Mina", GENDER.MS)) | |
| ## "Hello, Mr. Deepak" |
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
| nums = [1, 2, 3, 4, 5, 6] | |
| name = "123456" | |
| sslice = slice(1, 6, 2) | |
| print(nums[sslice] == nums[1:6:2]) # True | |
| print(name[sslice] == name[1:6:2]) # True |
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
| def decorator(): | |
| def inner(): | |
| print("Inner function") | |
| return inner | |
| outer = decorator() | |
| outer() | |
| # Inner function |
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 groupBy = <T = any>(fn: (item: T, i: number) => any, data: T[]) => | |
| data.map(fn).reduce((acc, val, i) => { | |
| acc[val] = (acc[val] || []).concat(data[i]); | |
| return acc; | |
| }, {}); | |
| const { odds, evens } = groupBy((item) => (item % 2 == 0 ? "evens" : "odds"), [ | |
| 1, | |
| 2, | |
| 3, | |
| 4, | |
| 5, | |
| ]); | |
| console.log(odds, evens); | |
| // [ 1, 3, 5 ] [ 2, 4 ] |
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
| import random | |
| def rand(num=4): | |
| return hex(int(random.random() * 10000000))[-num:] | |
| def uuid() -> str: | |
| return "-".join([rand(8), rand(4), rand(4), rand(4), rand(12)]) | |
| print(uuid()) | |
| # 0x4484cd-610d-9b87-55bb-0x85b665 |
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
| class Solution: | |
| def isPalindrome(self, x): | |
| num1 = str(x) | |
| num2 = num1[::-1] | |
| return num1 == num2 | |
| print(Solution().isPalindromewithReverse(121)) # True | |
| print(Solution().isPalindromewithReverse(-121)) # False |
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
| class Callable: | |
| def __init__(self): | |
| print("An instance of Callable was initialized") | |
| def __call__(self, *args, **kwargs): | |
| print("Arguments are:", args, kwargs) | |
| x = Callable() | |
| print("now calling the instance:") | |
| x(3, 4, x=11, y=10) | |
| """ | |
| An instance of Callable was initialized | |
| now calling the instance: | |
| Arguments are: (3, 4) {'x': 11, 'y': 10} | |
| """ |
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 PI = 3.141592653589793; | |
| // PI = 1 | |
| // Cannot assign to 'PI' because it is a constant. | |
| const numbers = Object.freeze([1, 2, 3, 4]); | |
| // Just like normal array, you can map on values | |
| numbers.forEach((x) => console.log(x)); | |
| // numbers.push() | |
| // Cannot add property 4, object is not extensible | |
| // OR in TS, Property 'push' does not exist on type 'readonly number[] |
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
| from functools import reduce | |
| def splitBy(fn, arr): | |
| def divider(tpl, item): | |
| if fn(item): | |
| tpl[0].append(item) | |
| else: | |
| tpl[1].append(item) | |
| return tpl | |
| return reduce(divider, arr, ([], [])) | |
| nums = [1, 2, 3, 4, 5] | |
| odds, evens = splitBy(lambda item: item % 2 != 0, nums) | |
| print(odds, evens) | |
| # [ 1, 3, 5 ] [ 2, 4 ] |
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
| def join(*args): | |
| return reduce(lambda a, b: f"{a}_{b}", args) | |
| def memoize(func): | |
| memo = {} | |
| def helper(*args): | |
| key = join(*args) | |
| if key not in memo: | |
| memo[key] = func(*args) | |
| return memo[key] | |
| return helper |
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
| def decorator(func): | |
| def inner(): | |
| print("run something before actual function") | |
| func() | |
| print("run something after actual function") | |
| return inner | |
| def func(): | |
| print("something...") | |
| decorated_func = decorator(func) | |
| decorated_func() | |
| """ | |
| run something before actual function | |
| something... | |
| run something after actual function | |
| """ |
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 numbers = Object.freeze([1, 2, 3, 4]); | |
| // Just like normal array, you can loop on values | |
| numbers.forEach((x) => console.log(x)); | |
| // Copy array and add new | |
| const anotherNumbers = [...numbers].concat(5); | |
| //[1,2,3,4,5] |
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
| thistuple = ("apple", "banana", "cherry") | |
| print(thistuple[0], thistuple[1], thistuple[2]) | |
| # apple banana cherry | |
| thisset = {"apple", "banana", "cherry"} | |
| print(thisset) | |
| ## {'apple', 'cherry', 'banana'} | |
| thisset.remove("apple") | |
| print(thisset) | |
| ## {'banana', 'cherry'} | |
| thisset.add("apple") | |
| print(thisset) | |
| ## {'banana', 'cherry'} | |
| thistuple[0] = "ball" | |
| print(thistuple) | |
| # TypeError: 'tuple' object does not support item assignment |
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
| @memoize | |
| def powHelper(x, n): | |
| if n == 0: | |
| return 1 | |
| return powHelper(x*x, n/2) if n % 2 == 0 else x * powHelper(x*x, (n-1)/2) | |
| class Solution: | |
| def myPow(self, x, n): | |
| m = n | |
| if n < 0: | |
| m *= -1 | |
| res = powHelper(x, m) | |
| return res if n >= 0 else 1/res | |
| print(Solution().myPow(2, 3)) # 8 | |
| print(Solution().myPow(2, 5)) # 32 | |
| print(Solution().myPow(2, -5)) # 0.03125 |
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
| def decorator(func): | |
| def inner(): | |
| print("run something before actual function") | |
| func() | |
| print("run something after actual function") | |
| return inner | |
| @decorator | |
| def func(): | |
| print("something...") | |
| func() | |
| """ | |
| run something before actual function | |
| something... | |
| run something after actual function | |
| """ |
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 configs = { | |
| API_URL: "some random urls", | |
| TIMEOUT: 30 * 60 * 10000, //in ms | |
| }; | |
| const newConfigs = { | |
| ...configs, | |
| SERVER_TIMEOUT: 100 * 60 * 10000, //in ms | |
| }; | |
| // OR | |
| const newConfigs2 = Object.assign({}, newConfigs, { | |
| SERVER_TIMEOUT: 100 * 60 * 10000, | |
| }); |
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
| nums = [1, 2, 3] | |
| numscopy = nums.copy() | |
| nums.append(4) | |
| print(nums, numscopy) | |
| ## [1, 2, 3, 4] [1, 2, 3] | |
| numscopy.append(5) | |
| print(nums, numscopy) | |
| ## [1, 2, 3, 4] [1, 2, 3, 5] | |
| numsmerged = nums.copy() | |
| numsmerged.extend(numscopy) | |
| print(numsmerged) | |
| ## [1, 2, 3, 4, 1, 2, 3, 5] | |
| # You can add any iterable using extend | |
| # Set | |
| numsmerged.extend({6, 7}) | |
| print(numsmerged) | |
| ## [1, 2, 3, 4, 1, 2, 3, 5, 6, 7] | |
| ## Dictionary- Default is keys | |
| numsmerged.extend({8: "v1", 9: "v2"}) | |
| print(numsmerged) | |
| ## [1, 2, 3, 4, 1, 2, 3, 5, 6, 7, 8, 9] | |
| # Dictionary Values | |
| numsmerged.extend(({8: "v1", 9: "v2"}).values()) | |
| print(numsmerged) | |
| ### [1, 2, 3, 4, 1, 2, 3, 5, 6, 7, 8, 9, 'v1', 'v2'] |
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
| def sum(*args): | |
| res = 0 | |
| for num in args: | |
| res += num | |
| return res | |
| print(sum(1, 2, 3)) # 6 | |
| print(sum(1, 2, 3, 4, 5)) # 15 |
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
| def prettify(func): | |
| def inner(*args, **kwargs): | |
| print("*" * 30) | |
| func(*args, **kwargs) | |
| print("*" * 30) | |
| return inner | |
| @prettify | |
| def pretty_print(*msg, **kwargs): | |
| print(*msg, **kwargs) | |
| pretty_print("Hello World") | |
| pretty_print(1, 2, 3) | |
| """ | |
| ****************************** | |
| Hello World | |
| ****************************** | |
| ****************************** | |
| 1 2 3 | |
| ****************************** | |
| """ |
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 details = new Map([ | |
| ["name", "deepak"], | |
| ["address", "some where in world"], | |
| ]); | |
| for (let key of details.keys()) { | |
| console.log(key); | |
| } | |
| //"name" "address" | |
| const updatedDetails = new Map([ | |
| ...details.entries(), | |
| ["newAddress", "still some where in world"], | |
| ]); | |
| for (let key of updatedDetails.keys()) { | |
| console.log(key); | |
| } | |
| //"name" "address" "newAddress" |
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
| class Dict(dict): | |
| def __add__(self, other): | |
| copy = self.copy() | |
| copy.update(other) | |
| return copy | |
| def __radd__(self, other): | |
| copy = other.copy() | |
| copy.update(self) | |
| return copy | |
| city_codes = Dict({"IN": 91, "USA": 1, "UK": 2}) | |
| print(city_codes) | |
| ## {'IN': 91, 'USA': 1, 'UK': 2} | |
| city_codes = city_codes + {"SG": 65} | |
| print(city_codes) | |
| ## {'IN': 91, 'USA': 1, 'UK': 2, 'SG': 65} | |
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
| # Using reduce, simplified version | |
| from functools import reduce | |
| def sum(*args): | |
| return reduce(lambda a, b: a+b, args) | |
| print(sum(1, 2, 3)) | |
| print(sum(1, 2, 3, 4, 5)) |
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
| class RealNumValidator: | |
| def __init__(self, func): | |
| self.func = func | |
| def __call__(self, *args, **kwds): | |
| if any([not(is_real_number(i)) for i in args]): | |
| raise ValueError("Invalid argument") | |
| return self.func(*args) | |
| class ZeroValidator: | |
| def __init__(self, func): | |
| self.func = func | |
| def __call__(self, *args, **kwds): | |
| if len(args) < 2 or args[1] == 0: | |
| raise ValueError("Number is not divisible by zero") | |
| return self.func(*args) |
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 split = (token = /\s+/, str = "") => str.split(token); | |
| const splitByHash = (str: string) => split(/#/, str); | |
| console.log(splitByHash("This#is#awesome")); | |
| // [ 'This', 'is', 'awesome' ] |
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
| def split(token=" ", txt=""): | |
| return txt.split(token) | |
| def curry(func): | |
| # to keep the name of the curried function: | |
| curry.__curried_func_name__ = func.__name__ | |
| f_args, f_kwargs = [], {} | |
| def f(*args, **kwargs): | |
| nonlocal f_args, f_kwargs | |
| if args or kwargs: | |
| f_args += args | |
| f_kwargs.update(kwargs) | |
| return f | |
| else: | |
| result = func(*f_args, *f_kwargs) | |
| f_args, f_kwargs = [], {} | |
| return result | |
| return f | |
| splitByHash = curry(split)("#") | |
| print(splitByHash("This#is#awesome#curry")()) | |
| ### ['This', 'is', 'awesome', 'curry'] |
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
| def range(**args): | |
| start = args["start"] if "start" in args else 0 | |
| end = args["end"] if "end" in args else 100 | |
| res = [] | |
| while start < end: | |
| res.append(start) | |
| start = start+1 | |
| return res | |
| print(range(start=10, end=20)) # [10, 11, 12, 13, 14, 15, 16, 17, 18, 19] |
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
| class RealNumValidator: | |
| def __init__(self, func): | |
| self.func = func | |
| def __call__(self, *args, **kwds): | |
| if any([not(is_real_number(i)) for i in args]): | |
| raise ValueError("Invalid argument") | |
| return self.func(*args) | |
| class ZeroValidator: | |
| def __init__(self, func): | |
| self.func = func | |
| def __call__(self, *args, **kwds): | |
| if len(args) < 2 or args[1] == 0: | |
| raise ValueError("Number is not divisible by zero") | |
| return self.func(*args) | |
| def is_real_number(num): | |
| return type(num) == int or type(num) == float | |
| @RealNumValidator | |
| @ZeroValidator | |
| def divide(num, den): | |
| return num/den | |
| @RealNumValidator | |
| def add(*arg): | |
| return sum(arg) | |
| print(divide(10, 2)) # 5.0 | |
| print(add(1, 2, 3)) # 6 | |
| print(divide("10", 2)) # ValueError: Invalid argument | |
| print(divide(10, 0)) # ValueError: Number is not divisible by zero |
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
| // Helper method, Curries a function. | |
| // https://decipher.dev/30-seconds-of-typescript/docs/curry | |
| const curry = (fn: Function, arity = fn.length, ...args: any[]): any => | |
| arity <= args.length ? fn(...args) : curry.bind(null, fn, arity, ...args); | |
| const split = (token = /\s+/, str = "") => str.split(token); | |
| const splitByHash = curry(split, 2)("#"); | |
| console.log(splitByHash("This#is#awesome")); | |
| // [ 'This', 'is', 'awesome' ] |
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
| def interest(p, t, r): | |
| return (p*t*r)/100 | |
| print(interest(100, 5, 1)) | |
| # 5.0 | |
| def is_loan_approved(loan_interest): | |
| return "REJECTED" if loan_interest > 100 else "PASS" | |
| print(is_loan_approved(interest(1000, 5, 1))) # PASS | |
| print(is_loan_approved(interest(10000, 5, 1))) # REJECTED | |
| ## Using compose | |
| def compose(g, f): | |
| def h(*arg): | |
| return g(f(*arg)) | |
| return h | |
| is_loan_valid = compose(is_loan_approved, interest) | |
| print(is_loan_valid(100, 5, 1)) ## PASS | |
| print(is_loan_valid(10000, 5, 1)) ## REJECTED |
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
| numbers = [1, 2, 3, 4, 5] | |
| result = map(lambda x: x*x, numbers) # return map object | |
| print(list(result)) # need to convert to list | |
| # Output: [1, 4, 9, 16, 25] |
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
| // Helper method, Performs right-to-left function composition. | |
| // https://decipher.dev/30-seconds-of-typescript/docs/compose/ | |
| const compose = (...fns: Function[]) => | |
| fns.reduce((f, g) => (...args: any[]) => f(...[g(...args)])); | |
| const add10 = (x: number) => x + 10; | |
| const multiply = (x: number, y: number) => x * y; | |
| const multiplyAndAdd5 = compose(add10, multiply); | |
| console.log(multiplyAndAdd5(5, 2)); // 20 |
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
| import json | |
| from urllib.request import urlopen | |
| def requestJson(url, default=[]): | |
| data = default | |
| try: | |
| data = json.load(urlopen(url)) | |
| except: | |
| print("Error while fetching data...") | |
| return data | |
| todos_url = "https://jsonplaceholder.typicode.com/todos" | |
| def main(): | |
| # Request todos json data | |
| todos = requestJson(todos_url) | |
| print(todos[0]) | |
| ## {'userId': 1, 'id': 1, 'title': 'delectus aut autem', 'completed': False} | |
| completed_todos = list(filter(lambda todo: todo["completed"], todos)) | |
| print(completed_todos[0]) | |
| ## {'userId': 1, 'id': 4, 'title': 'et porro tempora', 'completed': True} | |
| # fetch user ids who completed todos | |
| user_ids = set(map(lambda todo: todo["userId"], completed_todos)) | |
| print(user_ids) | |
| ## {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} | |
| # Get all user information | |
| users = list(map(lambda id: requestJson( | |
| f"https://jsonplaceholder.typicode.com/users/{id}"), user_ids)) | |
| print(users[0]) | |
| ## {'id': 1, 'name': 'Leanne Graham', ...} | |
| if __name__ == "__main__": | |
| main() |
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
| numbers = [1, 2, 3, 4, 5] | |
| def mapInt(num): | |
| return num*num if num % 2 == 0 else num*num*num | |
| print(list(map(mapInt, numbers))) |
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 sum = (nums: number[]) => nums.reduce((s, i) => s + i, 0) | |
| const average = (nums: number[]) => sum(nums) / nums.length | |
| const getActiveUserAges = (data: UserType[] = []) => data.filter(user => user.active === true).map(u => u.age) | |
| const users = [ | |
| { | |
| name: "deepak", | |
| age: 31, | |
| active: true | |
| }, | |
| { | |
| name: "sandy", | |
| age: 20, | |
| active: false | |
| }, | |
| { | |
| name: "unknown", | |
| age: 35, | |
| active: true | |
| } | |
| ] | |
| type UserType = typeof users[0] | |
| const activeUsers = getActiveUserAges(users) | |
| const sumOfAges = sum(activeUsers) | |
| console.log(sumOfAges/ activeUsers.length) |
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
| import json | |
| from urllib.request import urlopen | |
| def curry(func): | |
| # to keep the name of the curried function: | |
| curry.__curried_func_name__ = func.__name__ | |
| f_args, f_kwargs = [], {} | |
| def f(*args, **kwargs): | |
| nonlocal f_args, f_kwargs | |
| if args or kwargs: | |
| f_args += args | |
| f_kwargs.update(kwargs) | |
| return f | |
| else: | |
| result = func(*f_args, *f_kwargs) | |
| f_args, f_kwargs = [], {} | |
| return result | |
| return f | |
| def neg(fn): | |
| def _neg(*arg): | |
| return not fn(*arg) | |
| return _neg | |
| prop = curry(lambda key, data: data[key]) | |
| def isCompleted(todo): return todo["completed"] | |
| isNotCompleted = neg(isCompleted) | |
| getId = prop("id") | |
| ## Rest of the code | |
| def main(): | |
| todos = requestJson(todos_url) | |
| userWhoCompletedTodos = list(map(getId, filter(isCompleted, todos))) | |
| usersWhoNotCompletedIds = list(map(getId, filter(isNotCompleted, todos))) | |
| print(len(userWhoCompletedTodos), len(usersWhoNotCompletedIds)) | |
| if __name__ == "__main__": | |
| main() |
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
| // helper method | |
| const compose = (...fns: Function[]) => | |
| fns.reduce((f, g) => (...args: any[]) => f(...[g(...args)])); | |
| // sum of ages | |
| const getSumAges = compose(sum, getActiveUserAges); | |
| console.log(getSumAges(users)); | |
| // average of ages | |
| const getAverageOfAges = compose(average, getActiveUserAges); | |
| console.log(getAverageOfAges(users)); |
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
| async function main() { | |
| const response = await fetch("https://jsonplaceholder.typicode.com/todos/") // fetch todos | |
| .then((r) => r.json()); // then extract json | |
| // Response Todo[] | |
| // Todo {userId: number, id: number, title: string, completed: boolean} | |
| const todos = response; // extract Todo values | |
| console.log(todos[0]); // [{"userId": 1, "id": 1, "title": "delectus aut autem", "completed": false}, ...] | |
| const completedTodos = todos.filter((todo) => todo.completed); | |
| const usersIds = completedTodos.map((todo) => todo.userId); | |
| const getAllUserById = (id) => | |
| fetch(`https://jsonplaceholder.typicode.com/users/${id}`).then((r) => | |
| r.json() | |
| ); | |
| const userWhoCompletedTods = await Promise.all(usersIds.map(getAllUserById)); | |
| console.log(userWhoCompletedTods.length); | |
| console.log(userWhoCompletedTods[0]); | |
| } | |
| main(); |
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 curry = (fn, arity = fn.length, ...args) => | |
| arity <= args.length ? fn(...args) : curry.bind(null, fn, arity, ...args); | |
| const filter = (fn, data) => data.filter(fn); | |
| const map = (fn, data) => data.map(fn); | |
| const not = (fn) => (...args) => !fn(...args); | |
| const prop = curry((key, data) => data[key]); |
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 isCompleted = (item) => item.completed; | |
| const isNotCompleted = not(isCompleted); | |
| const getId = prop("id"); | |
| const userWhoCompletedTodos = map(getId, filter(isCompleted, todos)); | |
| const usersWhoNotCompletedIds = map(getId, filter(isNotCompleted, todos)); | |
| console.log(userWhoCompletedTodos.length, usersWhoNotCompletedIds.length); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment