diff sequences/@concat/concat.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/sequences/@concat/concat.m	Wed Dec 19 22:38:28 2012 +0000
@@ -0,0 +1,54 @@
+function o=concat(sources,varargin)
+% concat - Concatenate sequences
+%
+% concat ::
+%    seq (seq A)	~ 'sequence of sequences'
+% -> seq A       ~ 'resultant sequence'.
+%
+% concat ::
+%    {[N]->seq A}	~ 'cell array of N data objects',
+% -> seq A          ~ 'resultant sequence'.
+
+
+if nargin==0, o=concat(repeat(0));
+elseif nargin==1 && isa(sources,'concat'), o=elems;
+else
+	if iscell(sources), sources=celldata(sources); end
+	if isempty(sources), o=[]; return; end
+
+	hd=head(sources);
+	while isempty(hd)
+		sources=next(sources);
+		if isempty(sources), o=[]; return; end
+		hd=head(sources);
+	end
+	o.current=hd;
+	o.sources=next(sources);
+	ft.datafn=@datafn;
+	ft.charfn=@stringfn;
+	ft.nextfn=@nextfn;
+
+	o=class(o,'concat',data(size(o.current),ft));
+end
+
+
+function x=datafn(o), x=head(o.current);
+function s=stringfn(o), s=sprintf('concat(%s|...)',tostring(o.current));
+function o=nextfn(o),
+	s1=next(o.current);
+	if ~isempty(s1), 
+		o.current=s1; 
+		o=setsize(o,size(o.current)); 
+	else
+		if isempty(o.sources), o=[]; return; end
+
+		hd=head(o.sources);
+		while isempty(hd)
+			o.sources=next(o.sources);
+			if isempty(o.sources), o=[]; return; end
+			hd=head(o.sources);
+		end
+		o.current=hd;
+		o.sources=next(o.sources);
+		o=setsize(o,size(hd)); 
+	end