(obsFn, obsVal)
| 29 | // it must have the same behavior as hand-written method. We intentionally violate the spec |
| 30 | // in hope that it won't cause many troubles in practice. And in return we have more useful type. |
| 31 | ap(obsFn, obsVal) { |
| 32 | return combine([obsFn, obsVal], (fn, val) => fn(val)) |
| 33 | }, |
| 34 | |
| 35 | chain(fn, obs) { |
| 36 | return obs.flatMap(fn) |