samer@36: % merger - Combine several seq sources using a given function samer@3: % samer@36: % merger :: samer@3: % ( (A1,...,An)->natural ~ chooser function, samer@3: % n:natural ~ number of sources to combine, samer@3: % seq A1,...,seq An ~ n seq sources, samer@3: % ... ~ options samer@3: % ) -> seq B samer@36: classdef merger < seq samer@3: properties (GetAccess=private, SetAccess=private) samer@3: fn samer@3: sources samer@3: hd samer@3: end samer@3: methods samer@36: function d=merger(c,sources,varargin) samer@3: d.fn=c; samer@3: d.hd=[]; samer@3: d.sources=sources; samer@3: end samer@3: samer@3: samer@3: function x=head(d), x=d.hd; end samer@3: function d=next(d) samer@3: data=cellmap(@head,d.sources); samer@23: if isempty(data), d=nil samer@3: else samer@3: k=d.fn(data); samer@3: d.hd=data{k}; samer@3: nk=next(d.sources{k}); samer@3: if isempty(nk), d.sources(k)=[]; samer@3: else d.sources{k}=nk; end samer@3: end samer@3: end samer@3: samer@3: function z=elsize(d), z=size(d.hd); end samer@3: function s=tostring(d) samer@8: s=sprintf('{ %s } >> merge(%s)',catsep(',',cellmap(@tostring,d.sources)),tostring(d.fn)); samer@3: end samer@3: end samer@3: end