annotate sequences/+seq/selector.m @ 61:eff6bddf82e3
tip
Finally implemented perceptual brightness thing.
author |
samer |
date |
Sun, 11 Oct 2015 10:20:42 +0100 |
parents |
9d24b616bb06 |
children |
|
rev |
line source |
samer@36
|
1 % selector - Use boolean function to keep only matching elements from sequence
|
samer@3
|
2 %
|
samer@36
|
3 % selector :: (A->bool), seq(A) -> seq(A).
|
samer@36
|
4 classdef selector < seq
|
samer@3
|
5 properties (GetAccess=private, SetAccess=private)
|
samer@23
|
6 fn % :: A->bool
|
samer@23
|
7 source % :: seq(A)
|
samer@23
|
8 x % :: A
|
samer@23
|
9 end
|
samer@23
|
10 methods (Static)
|
samer@23
|
11 function o=make(fn,source)
|
samer@23
|
12 source=dropwhile(inverse(fn),source);
|
samer@38
|
13 if isempty(source), o=nil; else o=seq.selector(fn,source); end
|
samer@23
|
14 end
|
samer@3
|
15 end
|
samer@3
|
16 methods
|
samer@36
|
17 function d=selector(fn,source)
|
samer@23
|
18 d.fn=fn;
|
samer@23
|
19 d.x=head(source);
|
samer@3
|
20 d.source=source;
|
samer@3
|
21 end
|
samer@3
|
22
|
samer@3
|
23 function z=elsize(o), z=elsize(d.x); end
|
samer@3
|
24 function s=tostring(o), s=sprintf('%s >> %s?',tostring(o.source),tostring(o.fn)); end
|
samer@3
|
25 function x=head(d), x=d.x; end
|
samer@3
|
26 function o=next(o)
|
samer@3
|
27 while 1
|
samer@3
|
28 o.source=next(o.source);
|
samer@23
|
29 if isempty(o.source), o=nil; return; end
|
samer@3
|
30 o.x=head(o.source);
|
samer@3
|
31 if o.fn(o.x), break; end
|
samer@3
|
32 end
|
samer@3
|
33 end
|
samer@3
|
34 end
|
samer@3
|
35 end
|
samer@23
|
36
|
samer@23
|
37 function g=inverse(f), g=@(x)~f(x); end
|