包裹函数 – IO

最后更新于:2022-04-02 04:17:58

[TOC] ## IO ``` var IO = function(f) { this.unsafePerformIO = f; } IO.of = function(x) { return new IO(function() { return x; }); } IO.prototype.map = function(f) { return new IO(_.compose(f, this.unsafePerformIO )); } ``` `IO`跟之前的 functor 不同的地方在于,它的`__value`总是一个函数 实例1 ``` // io_window_ :: IO Window var io_window = new IO(function(){ return window; }); io_window.map(function(win){ return win.innerWidth }); // IO(1430) io_window.map(_.prop('location')).map(_.prop('href')).map(split('/')); // IO(["http:", "", "localhost:8000", "blog", "posts"]) // $ :: String -> IO [DOM] var $ = function(selector) { return new IO(function(){ return document.querySelectorAll(selector); }); } $('#myDiv').map(head).map(function(div){ return div.innerHTML; }); // IO('I am some inner html') ``` 实例2 ``` ////// 纯代码库: lib/params.js /////// // url :: IO String var url = new IO(function() { return window.location.href; }); // toPairs = String -> [[String]] var toPairs = compose(map(split('=')), split('&')); // params :: String -> [[String]] var params = compose(toPairs, last, split('?')); // findParam :: String -> IO Maybe [String] var findParam = function(key) { return map(compose(Maybe.of, filter(compose(eq(key), head)), params), url); }; ```
';