A functional JavaScript library to learn about functional programming.
There are great libraries like Ramda and Folktale, but it's good to understand what's going on under the hood.
Using ES6 and Tape for testing.
ap :: Functor (a -> b) -> Functor a -> Functor bapply :: (a... -> b) -> [a...] -> bchain :: (a -> M b) -> M a -> M bcompose :: (f -> g, ..., a -> b) -> a -> gcurry :: ((a, b, ..., f) => g) => a => b => ... f => g(up to arity of 6 uses curryN internally, then uses __curry)curryN :: ((a, b, ..., f) => g, n) => a => b => ... f => g(up to arity of 6 - then uses __curry)either :: (a -> c) -> (b -> c) -> Either a b -> cequals :: a -> b -> Booleanevery :: (a -> Boolean) -> [a] -> Booleanflip :: (a, ... b -> c) -> (b..., a -> c)(up to 6 arity, flipped function curried)handleError :: (e -> c) -> (a -> b) -> a -> (b | c)identity :: a -> akeys :: {String: *} -> [String]liftA2 :: (a -> b -> c) -> Functor a -> Functor b -> Functor cliftA3 :: (a -> b -> c -> d) -> Functor a -> Functor b -> Functor c -> Functor dliftA4 :: (a -> b -> c -> d -> e) -> Functor a -> Functor b -> Functor c -> Functor d -> Functor eliftA5 :: (a -> b -> c -> d -> e -> f) -> Functor a -> Functor b -> Functor c -> Functor d -> Functor e -> Functor fmap :: (a -> b) -> F a -> F bmaybe :: b -> (a -> b) -> Maybe a -> bonce :: (a... -> b) -> (a... -> b)toPairs :: {String: *} -> [[String, *]]trampoline :: (*... -> a) -> (*... -> a) - requires recursive call to be wrapped in a thunk trampoline.Thunk(() => [return value])typeOf :: * -> Stringvalues :: {String: *} -> [*]zip :: {String: *} -> [[String, *]]
Maybe.of - a -> Just aMaybe.Nothing -> Nothing
Maybe::ap - Maybe (a -> b) ~> Maybe a -> Maybe bMaybe::chain - Maybe a ~> (a -> Maybe b) -> Maybe bMaybe::equals - Maybe a ~> (Maybe b) -> BooleanMaybe::isJust - Maybe a ~> () -> BooleanMaybe::isNothing - Maybe a ~> () -> BooleanMaybe::map - Maybe a ~> (a -> b) -> Maybe b
Either.of - b -> Right bEither.Left - a -> Left a
Either::ap - Either a (b -> c) ~> Either b -> Either a cEither::chain - Either a b ~> (b -> Either a c) -> Either a cEither::map - Either a b ~> (b -> c) -> Either a cEither::isLeft - Either a b ~> () -> BooleanEither::isRight - Either a b ~> () -> Boolean
Future.of - a -> Future e aFuture.reject - e -> Future e
Future::fork - Future e a ~> (e -> (), a -> ()) -> ()Future::map - Future e a ~> (a -> b) -> Future e bFuture::chain - Future e a ~> (a -> Future b) -> Future e bFuture::ap - Future e (a -> b) ~> Future e a -> Future e b