samer@0: function o=concat(sources,varargin) samer@0: % concat - Concatenate sequences samer@0: % samer@0: % concat :: samer@0: % seq (seq A) ~ 'sequence of sequences' samer@0: % -> seq A ~ 'resultant sequence'. samer@0: % samer@0: % concat :: samer@0: % {[N]->seq A} ~ 'cell array of N data objects', samer@0: % -> seq A ~ 'resultant sequence'. samer@0: samer@0: samer@0: if nargin==0, o=concat(repeat(0)); samer@0: elseif nargin==1 && isa(sources,'concat'), o=elems; samer@0: else samer@0: if iscell(sources), sources=celldata(sources); end samer@0: if isempty(sources), o=[]; return; end samer@0: samer@0: hd=head(sources); samer@0: while isempty(hd) samer@0: sources=next(sources); samer@0: if isempty(sources), o=[]; return; end samer@0: hd=head(sources); samer@0: end samer@0: o.current=hd; samer@0: o.sources=next(sources); samer@0: ft.datafn=@datafn; samer@0: ft.charfn=@stringfn; samer@0: ft.nextfn=@nextfn; samer@0: samer@0: o=class(o,'concat',data(size(o.current),ft)); samer@0: end samer@0: samer@0: samer@0: function x=datafn(o), x=head(o.current); samer@0: function s=stringfn(o), s=sprintf('concat(%s|...)',tostring(o.current)); samer@0: function o=nextfn(o), samer@0: s1=next(o.current); samer@0: if ~isempty(s1), samer@0: o.current=s1; samer@0: o=setsize(o,size(o.current)); samer@0: else samer@0: if isempty(o.sources), o=[]; return; end samer@0: samer@0: hd=head(o.sources); samer@0: while isempty(hd) samer@0: o.sources=next(o.sources); samer@0: if isempty(o.sources), o=[]; return; end samer@0: hd=head(o.sources); samer@0: end samer@0: o.current=hd; samer@0: o.sources=next(o.sources); samer@0: o=setsize(o,size(hd)); samer@0: end