samer@0: function X=rndscanl(gen,s0,varargin) samer@0: % rndscanl - Random scanl samer@0: % samer@0: % rndscanl :: samer@0: % (S,A -> rndgen S) ~'random scanner', samer@0: % S ~'initial state', samer@0: % seq A, samer@0: % rndstate ~'initial random state' samer@0: % -> seq S. samer@0: samer@0: n=length(varargin)-1; samer@0: rs0=varargin{n+1}; samer@0: if n>1, samer@25: X=zipaccum(@zafn,{s0,rs0},varargin{1:n}); samer@0: elseif n==1 samer@25: X=mapaccum(@mafn,{s0,rs0},varargin{1}); samer@0: else samer@23: X=unfold(@ufn,{s0,rs0}); samer@0: end samer@0: samer@0: function [x,s]=ufn(s0) samer@0: setrndstate(s0{2}); samer@0: x=gen(s0{1}); samer@0: s={x,getrndstate}; samer@0: end samer@0: samer@0: function [x,s]=mafn(y,s0) samer@0: setrndstate(s0{2}); samer@0: x=gen(s0{1},y); samer@0: s={x,getrndstate}; samer@0: end samer@0: samer@0: function [x,s]=zafn(varargin) samer@0: s0=varargin{n+1}; samer@0: setrndstate(s0{2}); samer@0: x=gen(s0{1},varargin{1:n}); samer@0: s={x,getrndstate}; samer@0: end samer@0: end samer@0: samer@0: samer@0: