diff arrows/@erate/construct.m @ 0:672052bd81f8

Initial partial import.
author samer
date Wed, 19 Dec 2012 22:38:28 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/arrows/@erate/construct.m	Wed Dec 19 22:38:28 2012 +0000
@@ -0,0 +1,33 @@
+function u=construct(s,sizes_in)
+
+	nin=nargin(s.base);
+
+	u=construct(s.base,s.sizes_in(1:nin));
+	u.sizes_out = [u.sizes_out]; % !!! this is wrong. need better type system
+	u.process = mkproc(u.process,nin,nargout(s.base));
+end
+
+function f=mkproc(g,nin,nout)
+	empty={{}};
+	f=@proc;
+	if nin==1 && nout==1, f=@proc_11;
+	elseif nin==1 && nout==0, f=@proc_10; 
+	else, f=@proc_nn; end
+
+	function proc_10(x1), 
+		if ~isempty(x1), g(x1{1}); end; 
+	end
+	function y1=proc_11(x1,x), if isempty(x1), y1={}; else y1={g(x1{1})}; end; end
+
+	function varargout=proc_nn(varargin)
+		if any(cellfun(@isempty,varargin)), varargout=repmat(empty,1,nout);
+		else
+			ins=cellfun(@unbox,varargin(1:nin));
+			[outs{1:nout}]=g(ins{:});
+			varargout=cellfun(@box,outs);
+		end
+	end
+	function x=unbox(y), x=y{1}; end
+	function y=box(x), y={x}; end
+end
+