Mercurial > hg > ishara
diff sequences/+seq/buffer.m @ 3:3f77126f7b5f
First major revision of sequence library, now using classdef form, STILL A BIT BROKEN!
author | samer |
---|---|
date | Wed, 09 Jan 2013 22:22:21 +0000 |
parents | |
children | b1280319413e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sequences/+seq/buffer.m Wed Jan 09 22:22:21 2013 +0000 @@ -0,0 +1,70 @@ +% buffer - collect elements of sequence into sequence of arrays +% +% buffer :: +% seq([Size:[[1,E]]]) ~'sequence of E dimensional arrays', +% L:natural ~'buffer width', +% E:natural ~'effective dimension of input values', +% buffer_tailfn ~'function to deal with last incomplete buffer' +% -> seq([[Size,L]]) ~'buffered sequence (no-overlapping)'. +% +% buffer_tailfn can be +% seq.buffer.truncate :: void -> tailfn ~'discard incomplete buffer'. +% seq.buffer.append :: void -> tailfn ~'append smaller buffer to sequence'. +% seq.buffer.pad :: [[N]]-> tailfn ~'pad final buffer with value'. + +classdef buffer < seq + properties (GetAccess=private, SetAccess=immutable) + width + colons + tailfn + end + properties (GetAccess=private, SetAccess=private) + source + buf + end + methods + function a=buffer(source,L,dim,tailfn) + sz=size1(source); + if nargin<3, dim=length(sz); end + if nargin<4, tailfn=seq.buffer.truncate; end + colons = repmat({':'},1,dim); + buf=repmat(head(source),tosize([ones(size(colons)),L])); + source=next(source); + for i=2:L + if isempty(source), a=tailfn(buf,i-1,colons); return; end + buf(colons{:},i)=head(source); + source=next(source); + end + a.source = source; + a.width = L; + a.colons=colons; + a.tailfn = tailfn; + a.buf=buf; + end + + function z=elsize(a), z=size(a.buf); end + function s=tostring(a), s=sprintf('%s >> buffer(%d,%d)',tostring(a.source),a.width,length(a.colons)+1); end + function x=head(a), x=a.buf; end + function a=next(a) + % read next lot of values and make an array + for i=1:a.width + if isempty(a.source), a=a.tailfn(a.buf,i-1,a.colons); return; end + a.buf(a.colons{:},i)=head(a.source); + a.source=next(a.source); + end + end + end + + methods (Static) + function f=truncate, f=@(buf,i,colons)[]; end + function f=append, f=@(buf,i,colons)singleton(buf(colons{:},1:i)); end + function f=pad(x), f=@padfn; + function s=padfn(buf,i,colons) + L=size(buf,length(colons)+1); + buf(colons{:},i+1:L)=repmat(x,tosize([ones(size(colons)),L-i])); + s=singleton(buf); + end + end + end +end +