mobj 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/README.md +1 -1
- data/lib/ext/array.rb +24 -6
- data/lib/ext/basic_object.rb +4 -22
- data/lib/ext/false.rb +5 -0
- data/lib/ext/hash.rb +13 -4
- data/lib/ext/nil.rb +5 -0
- data/lib/ext/object.rb +73 -10
- data/lib/ext/string.rb +2 -0
- data/lib/mobj.rb +14 -12
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OTI0OTdjNzQ4Y2E5NTE4YzdlOGI5YTc4N2UwMDY4MzM0MWI2ZGJhMA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZTcwOWYzYTY0MGEyOGQ0NDM2YjY0YzA1NjI3Mjc1OWM5NTQzZTZjMQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NWQ0MjJlMjkwOTc4MmIyNzZmNmJkMGQwMWIxOTMyZmFlMGQwNDllYjIyOTNl
|
10
|
+
NGNiNjg2NmI0ODNmMTEwYWYwNjAyZGE1OWU1ZGE5N2EyZTQ0ZWFmYzcxZTRk
|
11
|
+
YTBmZWM2MGM1NDkzOGMwYWIzMGZkNTUxNzcwYzg5ZDlkZGI3YTM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZjYwZjEyNDY3NzEwNDE1NWMwYmI5NWViZmFmNmQ3ZjRlZDdlZGVlNThlNGRh
|
14
|
+
NWNkZjNhYWEwMzQ0MGIzMjE2ZDMxMzk2ODVlMzYwMzcwMzI3ODYyNzVlMjY4
|
15
|
+
NThiNWYzOGU3ZTBmZDQ1MDJmOGExMGE5MzRmMTZkMzA1NjE2ZDE=
|
data/README.md
CHANGED
data/lib/ext/array.rb
CHANGED
@@ -1,14 +1,27 @@
|
|
1
1
|
module Mobj
|
2
2
|
|
3
3
|
class ::Array
|
4
|
+
|
4
5
|
alias_method :includes?, :include?
|
5
6
|
alias_method :contains?, :include?
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
alias_method :mt?, :empty?
|
9
|
+
def filled?() !mt? end
|
10
|
+
alias_method :notempty?, :filled?
|
11
|
+
alias_method :full?, :filled?
|
12
|
+
alias_method :unempty?, :filled?
|
13
|
+
|
14
|
+
def ny?(method, *args)
|
15
|
+
any? { |o| o.send(method, *args) }
|
9
16
|
end
|
10
17
|
|
11
|
-
|
18
|
+
def no?(method, *args)
|
19
|
+
none? { |o| o.send(method, *args) }
|
20
|
+
end
|
21
|
+
|
22
|
+
def ll?(method, *args)
|
23
|
+
all? { |o| o.send(method, *args) }
|
24
|
+
end
|
12
25
|
|
13
26
|
def msum(initial = 0.0, op = :+, &block)
|
14
27
|
if block
|
@@ -31,7 +44,7 @@ module Mobj
|
|
31
44
|
self
|
32
45
|
end
|
33
46
|
|
34
|
-
def sequester(crush = true)
|
47
|
+
def sequester!(crush = true)
|
35
48
|
if crush
|
36
49
|
compact.size <= 1 ? compact.first : self
|
37
50
|
else
|
@@ -39,6 +52,10 @@ module Mobj
|
|
39
52
|
end
|
40
53
|
end
|
41
54
|
|
55
|
+
def realize!
|
56
|
+
empty? ? nil : self
|
57
|
+
end
|
58
|
+
|
42
59
|
def return_first(&block)
|
43
60
|
returned = nil
|
44
61
|
each { |item| break if (returned = block.call(item)) }
|
@@ -46,15 +63,16 @@ module Mobj
|
|
46
63
|
end
|
47
64
|
|
48
65
|
alias_method :earliest, :return_first
|
66
|
+
alias_method :first!, :return_first
|
49
67
|
|
50
68
|
def msym() map(&:sym) end
|
51
69
|
|
52
70
|
def apply(to)
|
53
71
|
map do |m|
|
54
|
-
if m.
|
72
|
+
if m.m?
|
55
73
|
to.send(m)
|
56
74
|
else
|
57
|
-
m.
|
75
|
+
m.s!.walk(to)
|
58
76
|
end
|
59
77
|
end
|
60
78
|
end
|
data/lib/ext/basic_object.rb
CHANGED
@@ -8,32 +8,14 @@ module Mobj
|
|
8
8
|
klass.superclass
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
12
|
-
|
13
|
-
end
|
14
|
-
|
15
|
-
def nil!(*)
|
16
|
-
self
|
17
|
-
end
|
11
|
+
def itself() self end
|
12
|
+
alias_method :self!, :itself
|
18
13
|
|
19
|
-
def
|
14
|
+
def p!(method=:puts)
|
15
|
+
send(method, self)
|
20
16
|
self
|
21
17
|
end
|
22
18
|
|
23
|
-
def wrap(*args, &block)
|
24
|
-
instance_exec(*args, &block)
|
25
|
-
end
|
26
|
-
|
27
|
-
alias_method :alter, :wrap
|
28
|
-
|
29
|
-
def tru?(t=true, _=nil, &block)
|
30
|
-
block ? instance_exec(t, &block) : t
|
31
|
-
end
|
32
|
-
|
33
|
-
def fals?(*)
|
34
|
-
nil
|
35
|
-
end
|
36
|
-
|
37
19
|
end
|
38
20
|
|
39
21
|
|
data/lib/ext/false.rb
CHANGED
data/lib/ext/hash.rb
CHANGED
@@ -4,6 +4,13 @@ module Mobj
|
|
4
4
|
|
5
5
|
module HashEx
|
6
6
|
|
7
|
+
def filled?() !mt? end
|
8
|
+
|
9
|
+
alias_method :notempty?, :filled?
|
10
|
+
alias_method :noempty?, :filled?
|
11
|
+
alias_method :full?, :filled?
|
12
|
+
alias_method :unempty?, :filled?
|
13
|
+
|
7
14
|
def apply!(obj)
|
8
15
|
map do |key, value|
|
9
16
|
obj.send(key, *value)
|
@@ -48,7 +55,7 @@ module Mobj
|
|
48
55
|
value = if name[-1] == '=' && args.size == 1
|
49
56
|
key = name[0...-1].sym
|
50
57
|
key = key.to_s if key?(key.to_s)
|
51
|
-
self[key] = args.sequester
|
58
|
+
self[key] = args.sequester!
|
52
59
|
elsif name[-1] == '?'
|
53
60
|
key = name[0...-1].sym
|
54
61
|
!!self[key, key.to_s]
|
@@ -56,13 +63,13 @@ module Mobj
|
|
56
63
|
key = name[0...-1].sym
|
57
64
|
val = self[key.sym] || self[key.to_s]
|
58
65
|
if !val && (block || args.unempty?)
|
59
|
-
self[key] = val = (block ? block.call(*args) : args.sequester)
|
66
|
+
self[key] = val = (block ? block.call(*args) : args.sequester!)
|
60
67
|
end
|
61
68
|
super unless val
|
62
69
|
else
|
63
70
|
self[name.sym] || self[name.to_s]
|
64
71
|
end
|
65
|
-
value ||= args.sequester unless args.empty?
|
72
|
+
value ||= args.sequester! unless args.empty?
|
66
73
|
|
67
74
|
return block ? block[value] : value
|
68
75
|
end
|
@@ -75,12 +82,14 @@ module Mobj
|
|
75
82
|
class ::Hash
|
76
83
|
include HashEx
|
77
84
|
|
85
|
+
alias_method :mt?, :empty?
|
86
|
+
|
78
87
|
alias_method :mlookup, :[]
|
79
88
|
alias_method :mdef, :default
|
80
89
|
alias_method :mfetch, :fetch
|
81
90
|
|
82
91
|
def [](*fkeys)
|
83
|
-
fkeys.map { |key| mlookup(key) || mfetch(key.sym) { mfetch(key.to_s) { mfetch(ki(key).sym) { mfetch(ki(key).to_s) { mdef(key) } } } } }.sequester
|
92
|
+
fkeys.map { |key| mlookup(key) || mfetch(key.sym) { mfetch(key.to_s) { mfetch(ki(key).sym) { mfetch(ki(key).to_s) { mdef(key) } } } } }.sequester!
|
84
93
|
end
|
85
94
|
|
86
95
|
def sym(recurse=false)
|
data/lib/ext/nil.rb
CHANGED
data/lib/ext/object.rb
CHANGED
@@ -1,14 +1,80 @@
|
|
1
1
|
module Mobj
|
2
2
|
|
3
3
|
class ::Object
|
4
|
-
|
4
|
+
|
5
|
+
def null!(*) self end
|
6
|
+
def nil!(*) self end
|
7
|
+
|
8
|
+
def wrap!(*args, &block)
|
9
|
+
block ? instance_exec(*args, &block) : args.sequester!
|
10
|
+
end
|
11
|
+
|
12
|
+
alias_method :alter!, :wrap!
|
13
|
+
alias_method :be!, :wrap!
|
14
|
+
|
15
|
+
alias_method :with!, :tap
|
16
|
+
|
17
|
+
def tru?(t=true, _=nil, &block) block ? instance_exec(t, &block) : t end
|
18
|
+
def fals?(*) nil end
|
19
|
+
|
20
|
+
def iff?(value = nil, &block) block ? instance_exec(value, &block) : value end
|
21
|
+
def iffn?(_=nil) nil end
|
22
|
+
|
23
|
+
def responds_to?(*any)
|
24
|
+
any.flatten.select { |method| respond_to?(method) }.realize!
|
25
|
+
end
|
26
|
+
|
27
|
+
def responds_to_all?(*all)
|
28
|
+
responds_to?(all) == all
|
29
|
+
end
|
30
|
+
|
31
|
+
def a?(*kls)
|
32
|
+
kls.when.mt?.be!([Array]).any? { |k| is_a? k }
|
33
|
+
end
|
34
|
+
|
35
|
+
def p?() a? Proc end
|
36
|
+
def m?() a? Symbol end
|
37
|
+
def s?() a? String end
|
38
|
+
def i?() a? Fixnum end
|
39
|
+
def f?() a? Float end
|
40
|
+
def n?() a? Fixnum, Float end
|
41
|
+
|
42
|
+
def h?() a? Hash end
|
43
|
+
def c?() a? Array, Hash end
|
44
|
+
|
45
|
+
def x?() a? NilClass, FalseClass end
|
46
|
+
|
47
|
+
def z0?() respond_to?(:zero?) ? zero? : f!.zero? end
|
48
|
+
|
49
|
+
def un?()
|
50
|
+
x? || (s? && s !~ /\S/) || (c? && mt?) || (n? && z0?)
|
51
|
+
end
|
52
|
+
|
53
|
+
def o?() !un? end
|
5
54
|
|
6
55
|
def i!() to_s.scan(/[\d\.]+/).join.to_i end #xxx strip out junk?
|
7
56
|
def f!() to_s.scan(/[\d\.]+/).join.to_f end
|
8
|
-
def
|
57
|
+
def s!() to_s end
|
9
58
|
def zeno!() z0? ? 1.0 : self end
|
10
59
|
|
11
|
-
|
60
|
+
def u!(*args)
|
61
|
+
if a?
|
62
|
+
each { |i| i.u!(*args) }
|
63
|
+
else
|
64
|
+
if responds_to_all? :assign_attributes, :save
|
65
|
+
args.select(&:h?).each do |arg|
|
66
|
+
assign_attributes(arg)
|
67
|
+
end
|
68
|
+
save(validate:false)
|
69
|
+
elsif responds_to? :update_attribute
|
70
|
+
args.select(&:h?).each do |arg|
|
71
|
+
arg.each do |k, v|
|
72
|
+
update_attribute(k, v)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
12
78
|
|
13
79
|
def rand?
|
14
80
|
rand(1000000).odd?
|
@@ -68,8 +134,9 @@ module Mobj
|
|
68
134
|
alias_method :ifnil, :try?
|
69
135
|
|
70
136
|
def when
|
137
|
+
iam = self
|
71
138
|
Forwarder.new do |name, *args, &block|
|
72
|
-
if methods.include?(name) && __send__(name, *args, &block)
|
139
|
+
if (iam.respond_to?(name) || iam.methods.include?(name)) && (got = iam.__send__(name, *args, &block))
|
73
140
|
thn = Forwarder.new do |name, *args, &block|
|
74
141
|
if name.sym == :then
|
75
142
|
thn
|
@@ -80,7 +147,7 @@ module Mobj
|
|
80
147
|
end
|
81
148
|
end
|
82
149
|
else
|
83
|
-
Forwarder.new do |name|
|
150
|
+
ret = Forwarder.new do |name, *args, &block|
|
84
151
|
if name.sym == :then
|
85
152
|
els = Forwarder.new do |name|
|
86
153
|
if name.sym == :else
|
@@ -90,7 +157,7 @@ module Mobj
|
|
90
157
|
end
|
91
158
|
end
|
92
159
|
else
|
93
|
-
|
160
|
+
iam
|
94
161
|
end
|
95
162
|
end
|
96
163
|
end
|
@@ -99,10 +166,6 @@ module Mobj
|
|
99
166
|
|
100
167
|
alias_method :if?, :when
|
101
168
|
|
102
|
-
def iff?(value = nil, &block)
|
103
|
-
block ? instance_exec(value, &block) : value
|
104
|
-
end
|
105
|
-
|
106
169
|
end
|
107
170
|
|
108
171
|
end
|
data/lib/ext/string.rb
CHANGED
data/lib/mobj.rb
CHANGED
@@ -9,6 +9,8 @@ module Mobj
|
|
9
9
|
attr_accessor :root, :handler
|
10
10
|
def initialize(root = nil, &handler) @root, @handler = root, handler end
|
11
11
|
def method_missing(name, *args, &block) handler.call(name, *args, &block) end
|
12
|
+
def to_ary() [root, handler] end
|
13
|
+
def inspect() { class:self.class, root:root, handler:handler}.inspect end
|
12
14
|
end
|
13
15
|
|
14
16
|
class Token
|
@@ -16,15 +18,15 @@ module Mobj
|
|
16
18
|
@type, @path, @options = type.to_sym, nil, {}
|
17
19
|
tokens = []
|
18
20
|
args.each do |arg|
|
19
|
-
if arg.
|
21
|
+
if arg.h?
|
20
22
|
@options.merge!(arg)
|
21
|
-
elsif arg.
|
23
|
+
elsif arg.s?
|
22
24
|
tokens << arg.sym
|
23
25
|
else
|
24
26
|
tokens << arg
|
25
27
|
end
|
26
28
|
end
|
27
|
-
@path = tokens.sequester
|
29
|
+
@path = tokens.sequester!
|
28
30
|
end
|
29
31
|
|
30
32
|
def to_s() "#{@type.to_s.upcase}(#@path#{ " => #@options" unless @options.empty?})" end
|
@@ -33,18 +35,18 @@ module Mobj
|
|
33
35
|
obj.__mobj__reparent
|
34
36
|
if path == :* || obj.nil?
|
35
37
|
obj
|
36
|
-
elsif obj.
|
38
|
+
elsif obj.a?
|
37
39
|
if path[0] == '*' && obj.respond_to?(path[1..-1].sym)
|
38
40
|
obj.__send__(path[1..-1].sym)
|
39
41
|
else
|
40
42
|
obj.map { |o| extract(o, path) }
|
41
43
|
end
|
42
|
-
elsif path.
|
44
|
+
elsif path.a?
|
43
45
|
path.map { |pth| obj[pth.sym] }
|
44
46
|
elsif path[0] == '*' && obj.respond_to?(path[1..-1].sym)
|
45
47
|
obj.__send__(path[1..-1].sym)
|
46
48
|
elsif obj.respond_to?(:[]) && (obj.is_a?(Hash) || path.to_s =~ /[0-9.-]+/)
|
47
|
-
if obj.
|
49
|
+
if obj.h?
|
48
50
|
obj[path.sym]
|
49
51
|
else
|
50
52
|
obj[path.to_s.to_i] if path.to_s =~ /^\d+$/
|
@@ -75,7 +77,7 @@ module Mobj
|
|
75
77
|
else
|
76
78
|
named = m.to_h.invert
|
77
79
|
name = if named.empty?
|
78
|
-
m.captures.empty? ? key : m.captures.sequester
|
80
|
+
m.captures.empty? ? key : m.captures.sequester!
|
79
81
|
else
|
80
82
|
named.find { |k, v| !k.nil? }.attempt(key).last
|
81
83
|
end
|
@@ -87,7 +89,7 @@ module Mobj
|
|
87
89
|
end
|
88
90
|
|
89
91
|
def walk(obj, root = obj)
|
90
|
-
obj, root = Circle.wrap(obj), Circle.wrap(root)
|
92
|
+
obj, root = Circle.wrap!(obj), Circle.wrap!(root)
|
91
93
|
val = case @type
|
92
94
|
when :literal
|
93
95
|
@path.to_s
|
@@ -135,16 +137,16 @@ module Mobj
|
|
135
137
|
end
|
136
138
|
|
137
139
|
class Circle
|
138
|
-
def self.wrap(wrapped)
|
140
|
+
def self.wrap!(wrapped)
|
139
141
|
return wrapped if wrapped.is_a?(CircleHash) || wrapped.is_a?(CircleRay)
|
140
142
|
|
141
143
|
if wrapped.is_a?(Array)
|
142
144
|
circle = CircleRay.new
|
143
|
-
wrapped.each_with_index { |item, i| circle[i] = wrap(item) }
|
145
|
+
wrapped.each_with_index { |item, i| circle[i] = wrap!(item) }
|
144
146
|
circle
|
145
147
|
elsif wrapped.is_a?(Hash)
|
146
148
|
circle = CircleHash.new
|
147
|
-
wrapped.each_pair { |key, val| circle[key] = wrap(val) }
|
149
|
+
wrapped.each_pair { |key, val| circle[key] = wrap!(val) }
|
148
150
|
circle
|
149
151
|
else
|
150
152
|
wrapped
|
@@ -190,7 +192,7 @@ module Mobj
|
|
190
192
|
end
|
191
193
|
|
192
194
|
alias_method :lookup, :[]
|
193
|
-
def [](*keys) keys.map { |key| self.lookup(key) }.sequester end
|
195
|
+
def [](*keys) keys.map { |key| self.lookup(key) }.sequester! end
|
194
196
|
end
|
195
197
|
|
196
198
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mobj
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mason Glaves
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-07-
|
11
|
+
date: 2013-07-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|