samer@40: function h=mtimes(g,f) samer@12: % compose - Constructs composition of two functions samer@12: % samer@40: % compose :: (A{:}->B{:}), (B{:}->C{:}) -> (A{:}->C{:}). samer@12: % samer@12: % returns the function h such that h(...) = f(g(...)) samer@39: % If functions have multiple returns and arguments, outputs samer@39: % from g are routed to f. samer@12: samer@39: n1=nargout(g); if n1<0, n1=inf; end samer@39: n2=nargin(f); if n2<0, n2=inf; end samer@39: n3=nargout(f); if n3<0, n3=inf; end samer@39: nint=min(n1,n2); samer@39: if ~isfinite(nint), error('Cannot determine number of intermediate values'); end samer@39: samer@39: fns = { @q00, @q01, @q0n; @q10, @q11, @q1n; @qn0, @qn1, @qnn }; samer@39: h=fns{ acount(nint,1)+1, acount(n3,1)+1}; samer@39: samer@39: function q00(varargin), g(varargin{:}); f(); end samer@39: function q10(varargin), f(g(varargin{:})); end samer@39: function qn0(varargin), [y{1:nint}]=g(varargin{:}); f(y{:}); end samer@39: function x=q01(varargin), g(varargin{:}); x=f(); end samer@39: function x=q11(varargin), x=f(g(varargin{:})); end samer@39: function x=qn1(varargin), [y{1:nint}]=g(varargin{:}); x=f(y{:}); end samer@39: function varargout=q0n(varargin), g(varargin{:}); [varargout{1:nargout}]=f(); end samer@39: function varargout=q1n(varargin), [varargout{1:nargout}]=f(g(varargin{:})); end samer@39: function varargout=qnn(varargin), [y{1:nint}]=g(varargin{:}); [varargout{1:nargout}]=f(y{:}); end samer@12: end