Mercurial > pub > Impl
comparison lib/IMPL/lang.pm @ 421:7798345304bc ref20150831
working on IMPL::Config, removed old stuff
author | cin |
---|---|
date | Sun, 16 Jul 2017 22:59:39 +0300 |
parents | bbc4739c4d48 |
children |
comparison
equal
deleted
inserted
replaced
420:df591e3afd10 | 421:7798345304bc |
---|---|
18 &typeof | 18 &typeof |
19 &ishash | 19 &ishash |
20 &isarray | 20 &isarray |
21 &isscalar | 21 &isscalar |
22 &isglob | 22 &isglob |
23 ) | |
24 ], | |
25 | |
26 declare => [ | |
27 qw( | |
28 &public | |
29 &protected | |
30 &private | |
31 &property | |
32 &static | |
33 &property | |
34 &_direct | |
35 &ACCESS_PUBLIC | |
36 &ACCESS_PROTECTED | |
37 &ACCESS_PRIVATE | |
38 &PROP_GET | |
39 &PROP_SET | |
40 &PROP_OWNERSET | |
41 &PROP_LIST | |
42 &PROP_ALL | |
43 &PROP_RO | |
44 &PROP_RW | |
45 &PROP_DIRECT | |
46 ) | 23 ) |
47 ], | 24 ], |
48 compare => [ | 25 compare => [ |
49 qw( | 26 qw( |
50 &equals | 27 &equals |
62 &hashSave | 39 &hashSave |
63 ) | 40 ) |
64 ] | 41 ] |
65 ); | 42 ); |
66 | 43 |
67 our @EXPORT_OK = keys %{ { map (($_,1) , map (@{$_}, values %EXPORT_TAGS) ) } }; | 44 our @EXPORT_OK = |
45 keys %{ { map ( ( $_, 1 ), map ( @{$_}, values %EXPORT_TAGS ) ) } }; | |
68 | 46 |
69 use IMPL::Const qw(:all); | 47 use IMPL::Const qw(:all); |
70 | 48 |
71 sub is { | 49 sub is { |
72 carp "A typename can't be undefined" unless $_[1]; | 50 carp "A typename can't be undefined" unless $_[1]; |
73 blessed($_[0]) and $_[0]->isa( $_[1] ); | 51 blessed( $_[0] ) and $_[0]->isa( $_[1] ); |
74 } | 52 } |
75 | 53 |
76 sub isclass { | 54 sub isclass { |
77 carp "A typename can't be undefined" unless $_[1]; | 55 carp "A typename can't be undefined" unless $_[1]; |
78 local $@; | 56 local $@; |
79 eval {not ref $_[0] and $_[0]->isa( $_[1] ) }; | 57 eval { not ref $_[0] and $_[0]->isa( $_[1] ) }; |
80 } | 58 } |
81 | 59 |
82 sub typeof(*) { | 60 sub typeof(*) { |
83 blessed($_[0]); | 61 blessed( $_[0] ); |
84 } | 62 } |
85 | 63 |
86 sub isarray { | 64 sub isarray { |
87 not blessed($_[0]) and ref $_[0] eq 'ARRAY'; | 65 not blessed( $_[0] ) and ref $_[0] eq 'ARRAY'; |
88 } | 66 } |
89 | 67 |
90 sub ishash { | 68 sub ishash { |
91 not blessed($_[0]) and ref $_[0] eq 'HASH'; | 69 not blessed( $_[0] ) and ref $_[0] eq 'HASH'; |
92 } | 70 } |
93 | 71 |
94 sub isscalar { | 72 sub isscalar { |
95 not blessed($_[0]) and ref $_[0] eq 'SCALAR'; | 73 not blessed( $_[0] ) and ref $_[0] eq 'SCALAR'; |
96 } | 74 } |
97 | 75 |
98 sub isglob { | 76 sub isglob { |
99 not blessed($_[0]) and ref $_[0] eq 'GLOB'; | 77 not blessed( $_[0] ) and ref $_[0] eq 'GLOB'; |
100 } | |
101 | |
102 sub public($) { | |
103 my $info = shift; | |
104 $info->{access} = ACCESS_PUBLIC; | |
105 my $implementor = delete $info->{implementor}; | |
106 $implementor->Implement($info); | |
107 } | |
108 | |
109 sub private($) { | |
110 my $info = shift; | |
111 $info->{access} = ACCESS_PRIVATE; | |
112 my $implementor = delete $info->{implementor}; | |
113 $implementor->Implement($info); | |
114 } | |
115 | |
116 sub protected($) { | |
117 my $info = shift; | |
118 $info->{access} = ACCESS_PROTECTED; | |
119 my $implementor = delete $info->{implementor}; | |
120 $implementor->Implement($info); | |
121 } | |
122 | |
123 sub _direct ($) { | |
124 my $info = shift; | |
125 $info->{direct} = 1; | |
126 return $info; | |
127 } | |
128 | |
129 sub property($$) { | |
130 my ($propName,$attributes) = @_; | |
131 | |
132 $attributes = { | |
133 get => $attributes & PROP_GET, | |
134 set => $attributes & PROP_SET, | |
135 isList => $attributes & PROP_LIST | |
136 } unless ref $attributes; | |
137 | |
138 my $class = caller; | |
139 | |
140 return hashMerge ( | |
141 $attributes, | |
142 { | |
143 implementor => $class->ClassPropertyImplementor, | |
144 name => $propName, | |
145 class => scalar(caller), | |
146 } | |
147 ); | |
148 } | |
149 | |
150 sub static($$) { | |
151 my ( $name, $value ) = @_; | |
152 my $class = caller; | |
153 $class->static_accessor( $name, $value ); | |
154 } | 78 } |
155 | 79 |
156 sub coarsen { | 80 sub coarsen { |
157 my ( $value, $resolution ) = @_; | 81 my ( $value, $resolution ) = @_; |
158 return $resolution ? ceil( $value / $resolution ) * $resolution : $value; | 82 return $resolution ? ceil( $value / $resolution ) * $resolution : $value; |
159 } | 83 } |
160 | 84 |
161 # datetime is DateTime object | 85 # datetime is DateTime object |
162 # resolution is DateTime::Duration object, the resulting time will be aligned to it | 86 # resolution is DateTime::Duration object, the resulting time will be aligned to it |
163 sub coarsen_dt { | 87 sub coarsen_dt { |
174 ) | 98 ) |
175 ); | 99 ); |
176 } | 100 } |
177 | 101 |
178 sub equals { | 102 sub equals { |
179 if (defined $_[0]) { | 103 if ( defined $_[0] ) { |
180 return 0 if (not defined $_[1]); | 104 return 0 if ( not defined $_[1] ); |
181 | 105 |
182 return $_[0] == $_[1]; | 106 return $_[0] == $_[1]; |
183 } else { | 107 } |
108 else { | |
184 return 0 if defined $_[1]; | 109 return 0 if defined $_[1]; |
185 | 110 |
186 return 1; | 111 return 1; |
187 } | 112 } |
188 } | 113 } |
189 | 114 |
190 sub equals_s { | 115 sub equals_s { |
191 if (defined $_[0]) { | 116 if ( defined $_[0] ) { |
192 return 0 if (not defined $_[1]); | 117 return 0 if ( not defined $_[1] ); |
193 | 118 |
194 return $_[0] eq $_[1]; | 119 return $_[0] eq $_[1]; |
195 } else { | 120 } |
121 else { | |
196 return 0 if defined $_[1]; | 122 return 0 if defined $_[1]; |
197 | 123 |
198 return 1; | 124 return 1; |
199 } | 125 } |
200 } | 126 } |
201 | 127 |
202 sub hashDiff { | 128 sub hashDiff { |
203 my ($src,$dst) = @_; | 129 my ( $src, $dst ) = @_; |
204 | 130 |
205 $dst = $dst ? { %$dst } : {} ; | 131 $dst = $dst ? {%$dst} : {}; |
206 $src ||= {}; | 132 $src ||= {}; |
207 | 133 |
208 my %result; | 134 my %result; |
209 | 135 |
210 foreach my $key ( keys %$src ) { | 136 foreach my $key ( keys %$src ) { |
211 if (exists $dst->{$key}) { | 137 if ( exists $dst->{$key} ) { |
212 $result{"+$key"} = $dst->{$key} unless equals_s($dst->{$key}, $src->{$key}); | 138 $result{"+$key"} = $dst->{$key} |
139 unless equals_s( $dst->{$key}, $src->{$key} ); | |
213 delete $dst->{$key}; | 140 delete $dst->{$key}; |
214 } else { | 141 } |
142 else { | |
215 $result{"-$key"} = 1; | 143 $result{"-$key"} = 1; |
216 } | 144 } |
217 } | 145 } |
218 | 146 |
219 $result{"+$_"} = $dst->{$_} foreach keys %$dst; | 147 $result{"+$_"} = $dst->{$_} foreach keys %$dst; |
220 | 148 |
221 return \%result; | 149 return \%result; |
222 } | 150 } |
223 | 151 |
224 sub hashMerge { | 152 sub hashMerge { |
225 return hashApply( { %{$_[0] || {}} }, $_[1] ); | 153 return hashApply( { %{ $_[0] || {} } }, $_[1] ); |
226 } | 154 } |
227 | 155 |
228 sub hashApply { | 156 sub hashApply { |
229 my ($target,$diff) = @_; | 157 my ( $target, $diff ) = @_; |
230 | 158 |
231 return $target unless ref $diff eq 'HASH'; | 159 return $target unless ref $diff eq 'HASH'; |
232 | 160 |
233 while ( my ($key,$value) = each %$diff) { | 161 while ( my ( $key, $value ) = each %$diff ) { |
234 $key =~ /^(\+|-)?(.*)$/; | 162 $key =~ /^(\+|-)?(.*)$/; |
235 my $op = $1 || '+'; | 163 my $op = $1 || '+'; |
236 $key = $2; | 164 $key = $2; |
237 | 165 |
238 if ($op eq '-') { | 166 if ( $op eq '-' ) { |
239 delete $target->{$key}; | 167 delete $target->{$key}; |
240 } else { | 168 } |
169 else { | |
241 $target->{$key} = $value; | 170 $target->{$key} = $value; |
242 } | 171 } |
243 } | 172 } |
244 | 173 |
245 return $target; | 174 return $target; |
246 } | 175 } |
247 | 176 |
248 sub hashCompare { | 177 sub hashCompare { |
249 my ($l,$r,$cmp) = @_; | 178 my ( $l, $r, $cmp ) = @_; |
250 | 179 |
251 $cmp ||= \&equals_s; | 180 $cmp ||= \&equals_s; |
252 | 181 |
253 return 0 unless scalar keys %$l == scalar keys %$r; | 182 return 0 unless scalar keys %$l == scalar keys %$r; |
254 &$cmp($l->{$_},$r->{$_}) || return 0 foreach keys %$l; | 183 &$cmp( $l->{$_}, $r->{$_} ) || return 0 foreach keys %$l; |
255 | 184 |
256 return 1; | 185 return 1; |
257 } | 186 } |
258 | 187 |
259 sub hashParse { | 188 sub hashParse { |
260 my ($s,$p,$d) = @_; | 189 my ( $s, $p, $d ) = @_; |
261 | 190 |
262 $p = $p ? qr/$p/ : qr/\n+/; | 191 $p = $p ? qr/$p/ : qr/\n+/; |
263 $d = $d ? qr/$d/ : qr/\s*=\s*/; | 192 $d = $d ? qr/$d/ : qr/\s*=\s*/; |
264 | 193 |
265 return { | 194 return { map split( $d, $_, 2 ), split( $p, $s ) }; |
266 map split($d,$_,2), split($p,$s) | |
267 }; | |
268 } | 195 } |
269 | 196 |
270 sub hashSave { | 197 sub hashSave { |
271 my ($hash,$p,$d) = @_; | 198 my ( $hash, $p, $d ) = @_; |
272 | 199 |
273 return "" unless ref $hash eq 'HASH'; | 200 return "" unless ref $hash eq 'HASH'; |
274 | 201 |
275 $p ||= "\n"; | 202 $p ||= "\n"; |
276 $d ||= " = "; | 203 $d ||= " = "; |
277 | 204 |
278 return | 205 return join( $p, map( join( $d, $_, $hash->{$_} ), keys %$hash ) ); |
279 join( | |
280 $p, | |
281 map( | |
282 join( | |
283 $d, | |
284 $_, | |
285 $hash->{$_} | |
286 ), | |
287 keys %$hash | |
288 ) | |
289 ); | |
290 } | 206 } |
291 | 207 |
292 1; | 208 1; |