samer@0
|
1 function o=concat(sources,varargin)
|
samer@0
|
2 % concat - Concatenate sequences
|
samer@0
|
3 %
|
samer@0
|
4 % concat ::
|
samer@0
|
5 % seq (seq A) ~ 'sequence of sequences'
|
samer@0
|
6 % -> seq A ~ 'resultant sequence'.
|
samer@0
|
7 %
|
samer@0
|
8 % concat ::
|
samer@0
|
9 % {[N]->seq A} ~ 'cell array of N data objects',
|
samer@0
|
10 % -> seq A ~ 'resultant sequence'.
|
samer@0
|
11
|
samer@0
|
12
|
samer@0
|
13 if nargin==0, o=concat(repeat(0));
|
samer@0
|
14 elseif nargin==1 && isa(sources,'concat'), o=elems;
|
samer@0
|
15 else
|
samer@0
|
16 if iscell(sources), sources=celldata(sources); end
|
samer@0
|
17 if isempty(sources), o=[]; return; end
|
samer@0
|
18
|
samer@0
|
19 hd=head(sources);
|
samer@0
|
20 while isempty(hd)
|
samer@0
|
21 sources=next(sources);
|
samer@0
|
22 if isempty(sources), o=[]; return; end
|
samer@0
|
23 hd=head(sources);
|
samer@0
|
24 end
|
samer@0
|
25 o.current=hd;
|
samer@0
|
26 o.sources=next(sources);
|
samer@0
|
27 ft.datafn=@datafn;
|
samer@0
|
28 ft.charfn=@stringfn;
|
samer@0
|
29 ft.nextfn=@nextfn;
|
samer@0
|
30
|
samer@0
|
31 o=class(o,'concat',data(size(o.current),ft));
|
samer@0
|
32 end
|
samer@0
|
33
|
samer@0
|
34
|
samer@0
|
35 function x=datafn(o), x=head(o.current);
|
samer@0
|
36 function s=stringfn(o), s=sprintf('concat(%s|...)',tostring(o.current));
|
samer@0
|
37 function o=nextfn(o),
|
samer@0
|
38 s1=next(o.current);
|
samer@0
|
39 if ~isempty(s1),
|
samer@0
|
40 o.current=s1;
|
samer@0
|
41 o=setsize(o,size(o.current));
|
samer@0
|
42 else
|
samer@0
|
43 if isempty(o.sources), o=[]; return; end
|
samer@0
|
44
|
samer@0
|
45 hd=head(o.sources);
|
samer@0
|
46 while isempty(hd)
|
samer@0
|
47 o.sources=next(o.sources);
|
samer@0
|
48 if isempty(o.sources), o=[]; return; end
|
samer@0
|
49 hd=head(o.sources);
|
samer@0
|
50 end
|
samer@0
|
51 o.current=hd;
|
samer@0
|
52 o.sources=next(o.sources);
|
samer@0
|
53 o=setsize(o,size(hd));
|
samer@0
|
54 end
|