Appendix C: Pointfree Utilities

    chain

    1. // chain :: Monad m => (a -> m b) -> m a -> m b
    2. const chain = curry((fn, m) => m.chain(fn));

    concat

    1. // concat :: String -> String -> String
    2. const concat = curry((a, b) => a.concat(b));

    eq

    1. // eq :: Eq a => a -> a -> Boolean
    2. const eq = curry((a, b) => a === b);

    filter

    1. // filter :: (a -> Boolean) -> [a] -> [a]
    2. const filter = curry((fn, xs) => xs.filter(fn));

    flip

    1. // flip :: (a -> b) -> (b -> a)
    2. const flip = curry((fn, a, b) => fn(b, a));

    forEach

    1. // forEach :: (a -> ()) -> [a] -> ()
    2. const forEach = curry((fn, xs) => xs.forEach(fn));

    head

    1. // head :: [a] -> a
    2. const head = xs => xs[0];

    intercalate

    1. // intercalate :: String -> [String] -> String
    2. const intercalate = curry((str, xs) => xs.join(str));

    last

    1. // last :: [a] -> a
    2. const last = xs => xs[xs.length - 1];

    map

    1. const map = curry((fn, f) => f.map(fn));

    match

    1. // match :: RegExp -> String -> Boolean
    2. const match = curry((re, str) => re.test(str));

    prop

    1. // prop :: String -> Object -> a
    2. const prop = curry((p, obj) => obj[p]);

    reduce

    1. // reduce :: (b -> a -> b) -> b -> [a] -> b
    2. const reduce = curry((fn, zero, xs) => xs.reduce(fn, zero));

    replace

    1. // replace :: RegExp -> String -> String -> String
    2. const replace = curry((re, rpl, str) => str.replace(re, rpl));

    reverse

    1. const reverse = x => Array.isArray(x) ? x.reverse() : x.split('').reverse().join('');

    safeHead

    1. // safeHead :: [a] -> Maybe a
    2. const safeHead = compose(Maybe.of, head);

    safeProp

    1. // safeProp :: String -> Object -> Maybe a
    2. const safeProp = curry((p, obj) => compose(Maybe.of, prop(p))(obj));

    sequence

    1. // sequence :: (Applicative f, Traversable t) => (a -> f a) -> t (f a) -> f (t a)
    2. const sequence = curry((of, f) => f.sequence(of));

    sortBy

    1. // sortBy :: Ord b => (a -> b) -> [a] -> [a]
    2. const sortBy = curry((fn, xs) => {
    3. if (fn(a) === fn(b)) {
    4. return 0;
    5. }
    6. return fn(a) > fn(b) ? 1 : -1;
    7. });
    8. });

    split

    1. // split :: String -> String -> [String]
    2. const split = curry((sep, str) => str.split(sep));

    take

    1. // take :: Number -> [a] -> [a]
    2. const take = curry((n, xs) => xs.slice(0, n));

    toLowerCase

    1. // toLowerCase :: String -> String
    2. const toLowerCase = s => s.toLowerCase();

    toString

    1. // toString :: a -> String
    2. const toString = String;

    toUpperCase

    1. // toUpperCase :: String -> String
    2. const toUpperCase = s => s.toUpperCase();

    unsafePerformIO

    1. // unsafePerformIO :: IO a -> a