facets 2.1.3 → 2.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.
- data/AUTHORS +14 -12
- data/CHANGES +45 -2
- data/NOTES +9 -7
- data/lib/core/facets/1stclassmethod.rb +15 -11
- data/lib/core/facets/array.rb +0 -1
- data/lib/core/facets/array/conjoin.rb +40 -8
- data/lib/core/facets/array/delete.rb +8 -2
- data/lib/core/facets/array/indexable.rb +30 -3
- data/lib/core/facets/array/merge.rb +11 -0
- data/lib/core/facets/array/only.rb +3 -3
- data/lib/core/facets/array/pad.rb +4 -46
- data/lib/core/facets/array/rotate.rb +4 -4
- data/lib/core/facets/array/select.rb +2 -0
- data/lib/core/facets/array/splice.rb +16 -2
- data/lib/core/facets/array/stackable.rb +6 -40
- data/lib/core/facets/binding.rb +3 -0
- data/lib/core/facets/binding/cflow.rb +10 -64
- data/lib/core/facets/binding/defined.rb +10 -0
- data/lib/core/facets/binding/eval.rb +10 -76
- data/lib/core/facets/binding/here.rb +9 -0
- data/lib/core/facets/binding/self.rb +10 -0
- data/lib/core/facets/binding/vars.rb +0 -45
- data/lib/core/facets/boolean.rb +31 -103
- data/lib/core/facets/class/descendents.rb +17 -44
- data/lib/core/facets/comparable/bound.rb +8 -70
- data/lib/core/facets/comparable/cmp.rb +12 -92
- data/lib/core/facets/conversion.rb +122 -321
- data/lib/core/facets/dir/multiglob.rb +0 -13
- data/lib/core/facets/dir/traverse.rb +61 -111
- data/lib/core/facets/enumerable.rb +4 -2
- data/lib/core/facets/enumerable/cartesian.rb +36 -85
- data/lib/core/facets/enumerable/collect.rb +64 -152
- data/lib/core/facets/enumerable/combination.rb +40 -42
- data/lib/core/facets/enumerable/count.rb +99 -174
- data/lib/core/facets/enumerable/each.rb +86 -0
- data/lib/core/facets/enumerable/mash.rb +58 -0
- data/lib/core/facets/enumerable/permutation.rb +39 -44
- data/lib/core/facets/enumerable/probability.rb +16 -90
- data/lib/core/facets/enumerable/split.rb +113 -0
- data/lib/core/facets/exception/detail.rb +1 -2
- data/lib/core/facets/facets.rb +3 -2
- data/lib/core/facets/file/read.rb +4 -59
- data/lib/core/facets/file/topath.rb +8 -96
- data/lib/core/facets/file/write.rb +21 -49
- data/lib/core/facets/filetest/root.rb +4 -3
- data/lib/core/facets/functor.rb +5 -43
- data/lib/core/facets/hash/at.rb +7 -37
- data/lib/core/facets/hash/delete.rb +9 -58
- data/lib/core/facets/hash/has_keys.rb +4 -43
- data/lib/core/facets/hash/insert.rb +5 -38
- data/lib/core/facets/hash/inverse.rb +2 -41
- data/lib/core/facets/hash/iterate.rb +4 -45
- data/lib/core/facets/hash/keyize.rb +24 -92
- data/lib/core/facets/hash/merge.rb +4 -38
- data/lib/core/facets/hash/new.rb +5 -38
- data/lib/core/facets/hash/op.rb +20 -66
- data/lib/core/facets/hash/rekey.rb +9 -87
- data/lib/core/facets/hash/select.rb +1 -1
- data/lib/core/facets/hash/slice.rb +42 -0
- data/lib/core/facets/hash/traverse.rb +6 -46
- data/lib/core/facets/hash/update.rb +27 -67
- data/lib/core/facets/hash/weave.rb +22 -42
- data/lib/core/facets/indexable.rb +42 -14
- data/lib/core/facets/integer/bitmask.rb +69 -106
- data/lib/core/facets/integer/factorial.rb +1 -44
- data/lib/core/facets/integer/multiples.rb +27 -22
- data/lib/core/facets/integer/of.rb +1 -33
- data/lib/core/facets/kernel.rb +4 -2
- data/lib/core/facets/kernel/ask.rb +15 -3
- data/lib/core/facets/kernel/callstack.rb +38 -69
- data/lib/core/facets/kernel/constant.rb +2 -38
- data/lib/core/facets/kernel/deepcopy.rb +3 -55
- data/lib/core/facets/kernel/dir.rb +2 -0
- data/lib/core/facets/kernel/ergo.rb +2 -2
- data/lib/core/facets/kernel/instance.rb +51 -120
- data/lib/core/facets/kernel/metaid.rb +35 -73
- data/lib/core/facets/kernel/object.rb +14 -39
- data/lib/core/facets/kernel/op_esc.rb +24 -2
- data/lib/core/facets/kernel/populate.rb +6 -69
- data/lib/core/facets/kernel/report.rb +28 -33
- data/lib/core/facets/kernel/require.rb +7 -21
- data/lib/core/facets/kernel/respond.rb +11 -1
- data/lib/core/facets/kernel/returning.rb +50 -0
- data/lib/core/facets/kernel/silence.rb +12 -24
- data/lib/core/facets/kernel/super.rb +12 -76
- data/lib/core/facets/kernel/tap.rb +25 -107
- data/lib/core/facets/kernel/val.rb +7 -46
- data/lib/core/facets/kernel/withattr.rb +6 -64
- data/lib/core/facets/matchdata/matchset.rb +8 -50
- data/lib/core/facets/module.rb +3 -1
- data/lib/core/facets/module/abstract.rb +9 -47
- data/lib/core/facets/module/alias.rb +11 -68
- data/lib/core/facets/module/attr.rb +36 -15
- data/lib/core/facets/module/cattr.rb +8 -76
- data/lib/core/facets/module/clone.rb +15 -66
- data/lib/core/facets/module/include.rb +54 -114
- data/lib/core/facets/module/methods.rb +15 -13
- data/lib/core/facets/module/modify.rb +20 -206
- data/lib/core/facets/module/name.rb +19 -83
- data/lib/core/facets/module/require.rb +48 -53
- data/lib/core/facets/module/traits.rb +74 -33
- data/lib/core/facets/nilclass/status.rb +25 -2
- data/lib/core/facets/numeric/round.rb +24 -89
- data/lib/core/facets/proc/bind.rb +16 -59
- data/lib/core/facets/proc/compose.rb +6 -40
- data/lib/core/facets/proc/fn.rb +2 -0
- data/lib/core/facets/range/combine.rb +15 -51
- data/lib/core/facets/range/overlap.rb +8 -64
- data/lib/core/facets/regexp/arity.rb +6 -41
- data/lib/core/facets/stackable.rb +43 -4
- data/lib/core/facets/string.rb +2 -0
- data/lib/core/facets/string/align.rb +45 -55
- data/lib/core/facets/string/blank.rb +2 -46
- data/lib/core/facets/string/bracket.rb +14 -87
- data/lib/core/facets/string/case.rb +45 -32
- data/lib/core/facets/string/crypt.rb +3 -40
- data/lib/core/facets/string/filter.rb +7 -49
- data/lib/core/facets/string/format.rb +24 -126
- data/lib/core/facets/string/indexable.rb +50 -133
- data/lib/core/facets/string/interpolate.rb +24 -59
- data/lib/core/facets/string/natcmp.rb +5 -39
- data/lib/core/facets/string/nchar.rb +37 -45
- data/lib/core/facets/string/op.rb +13 -0
- data/lib/core/facets/string/partitions.rb +38 -99
- data/lib/core/facets/string/range.rb +8 -49
- data/lib/core/facets/string/regesc.rb +9 -42
- data/lib/core/facets/string/scan.rb +6 -52
- data/lib/core/facets/string/splice.rb +8 -13
- data/lib/core/facets/string/tabs.rb +16 -153
- data/lib/core/facets/symbol.rb +3 -1
- data/lib/core/facets/symbol/chomp.rb +11 -29
- data/lib/core/facets/symbol/generate.rb +4 -43
- data/lib/core/facets/symbol/not.rb +13 -25
- data/lib/core/facets/symbol/shadow.rb +2 -40
- data/lib/core/facets/symbol/succ.rb +14 -13
- data/lib/core/facets/symbol/to_proc.rb +33 -28
- data/lib/core/facets/time.rb +1 -0
- data/lib/core/facets/time/change.rb +5 -38
- data/lib/core/facets/time/elapse.rb +2 -41
- data/lib/core/facets/time/stamp.rb +47 -0
- data/lib/core/facets/unboundmethod.rb +3 -0
- data/lib/core/facets/unboundmethod/arguments.rb +27 -4
- data/lib/core/facets/unboundmethod/name.rb +21 -7
- data/lib/methods/facets/enumerable/cluster_by.rb +1 -1
- data/lib/methods/facets/enumerable/collate.rb +1 -0
- data/lib/methods/facets/enumerable/divide.rb +1 -1
- data/lib/methods/facets/enumerable/each_by.rb +1 -1
- data/lib/methods/facets/enumerable/each_pair.rb +1 -1
- data/lib/methods/facets/enumerable/eachn.rb +1 -1
- data/lib/methods/facets/enumerable/graph.rb +1 -1
- data/lib/methods/facets/enumerable/group_by.rb +1 -1
- data/lib/methods/facets/enumerable/inject.rb +1 -0
- data/lib/methods/facets/enumerable/map_send.rb +1 -0
- data/lib/methods/facets/enumerable/modulate.rb +1 -0
- data/lib/methods/facets/enumerable/partition_by.rb +1 -1
- data/lib/methods/facets/hash/collate.rb +1 -1
- data/lib/methods/facets/hash/except.rb +1 -0
- data/lib/methods/facets/hash/graph.rb +1 -1
- data/lib/methods/facets/hash/mash.rb +1 -0
- data/lib/methods/facets/kernel/Bit.rb +1 -0
- data/lib/methods/facets/kernel/complete.rb +1 -1
- data/lib/methods/facets/kernel/here.rb +1 -1
- data/lib/methods/facets/kernel/non_nil.rb +1 -0
- data/lib/methods/facets/kernel/respond_with_value.rb +1 -0
- data/lib/methods/facets/kernel/with.rb +1 -1
- data/lib/methods/facets/module/class_def.rb +1 -0
- data/lib/methods/facets/string/camelcase.rb +1 -0
- data/lib/methods/facets/string/op_minus.rb +1 -0
- data/lib/methods/facets/string/snakecase.rb +1 -0
- data/lib/more/facets/attributes.rb +5 -5
- data/lib/more/facets/basicobject.rb +0 -62
- data/lib/{core/facets/continuation/create.rb → more/facets/continuation.rb} +4 -21
- data/lib/more/facets/duration.rb +534 -0
- data/lib/more/facets/lazy.rb +3 -3
- data/lib/more/facets/namespace.rb +23 -71
- data/lib/more/facets/rbsystem.rb +42 -8
- data/lib/more/facets/stylize.rb +6 -3
- data/lib/more/facets/thread.rb +55 -0
- data/meta/MANIFEST +49 -18
- data/meta/ROLLRC +1 -1
- data/meta/project.yaml +2 -2
- data/task/install +1 -1
- data/task/test/general +8 -2
- data/test/unit/array/test_pad.rb +30 -45
- data/test/unit/array/test_stackable.rb +14 -28
- data/test/unit/binding/test_cflow.rb +34 -49
- data/test/unit/binding/test_defined.rb +17 -0
- data/test/unit/binding/test_eval.rb +11 -39
- data/test/unit/binding/test_here.rb +17 -0
- data/test/unit/binding/test_self.rb +17 -0
- data/test/unit/binding/test_vars.rb +22 -37
- data/test/unit/class/test_descendents.rb +15 -30
- data/test/unit/class/test_initializer.rb +1 -8
- data/test/unit/comparable/test_bound.rb +38 -53
- data/test/unit/comparable/test_cmp.rb +45 -60
- data/test/unit/dir/test_traverse.rb +56 -0
- data/test/unit/enumerable/test_cartesian.rb +34 -47
- data/test/unit/enumerable/test_collect.rb +16 -125
- data/test/unit/enumerable/test_combination.rb +1 -8
- data/test/unit/enumerable/test_count.rb +51 -66
- data/test/unit/enumerable/test_each.rb +77 -0
- data/test/unit/enumerable/test_mash.rb +51 -0
- data/test/unit/enumerable/test_permutation.rb +1 -7
- data/test/unit/enumerable/test_probability.rb +42 -55
- data/test/unit/enumerable/test_split.rb +52 -0
- data/test/unit/exception/test_detail.rb +19 -0
- data/test/unit/file/test_read.rb +34 -0
- data/test/unit/file/test_topath.rb +17 -25
- data/test/unit/file/test_write.rb +6 -12
- data/test/unit/filetest/test_root.rb +14 -0
- data/test/unit/hash/test_at.rb +9 -21
- data/test/unit/hash/test_delete.rb +22 -37
- data/test/unit/hash/test_has_keys.rb +13 -28
- data/test/unit/hash/test_insert.rb +9 -23
- data/test/unit/hash/test_inverse.rb +11 -26
- data/test/unit/hash/test_iterate.rb +16 -31
- data/test/unit/hash/test_keyize.rb +40 -55
- data/test/unit/hash/test_merge.rb +10 -25
- data/test/unit/hash/test_new.rb +9 -24
- data/test/unit/hash/test_op.rb +1 -7
- data/test/unit/hash/test_rekey.rb +47 -62
- data/test/unit/hash/test_traverse.rb +17 -32
- data/test/unit/hash/test_update.rb +30 -45
- data/test/unit/hash/test_weave.rb +10 -23
- data/test/unit/integer/test_bitmask.rb +48 -44
- data/test/unit/integer/test_factorial.rb +11 -26
- data/test/unit/integer/test_multiples.rb +1 -5
- data/test/unit/integer/test_of.rb +14 -29
- data/test/unit/kernel/test_callstack.rb +13 -28
- data/test/unit/kernel/test_constant.rb +14 -28
- data/test/unit/kernel/test_deepcopy.rb +20 -35
- data/test/unit/kernel/test_instance.rb +46 -61
- data/test/unit/kernel/test_metaid.rb +42 -57
- data/test/unit/kernel/test_object.rb +14 -29
- data/test/unit/kernel/test_populate.rb +38 -53
- data/test/unit/kernel/test_report.rb +1 -7
- data/test/unit/kernel/test_returning.rb +16 -0
- data/test/unit/kernel/test_silence.rb +8 -23
- data/test/unit/kernel/test_super.rb +41 -56
- data/test/unit/kernel/test_tap.rb +15 -39
- data/test/unit/kernel/test_val.rb +7 -20
- data/test/unit/kernel/test_withattr.rb +29 -44
- data/test/unit/matchdata/test_matchset.rb +20 -35
- data/test/unit/module/test_abstract.rb +15 -30
- data/test/unit/module/test_alias.rb +32 -45
- data/test/unit/module/test_cattr.rb +39 -54
- data/test/unit/module/test_clone.rb +31 -43
- data/test/unit/module/test_include.rb +1 -35
- data/test/unit/module/test_modify.rb +102 -114
- data/test/unit/module/test_name.rb +1 -7
- data/test/unit/numeric/test_round.rb +46 -61
- data/test/unit/proc/test_bind.rb +29 -44
- data/test/unit/proc/test_compose.rb +20 -35
- data/test/unit/range/test_combine.rb +14 -29
- data/test/unit/range/test_overlap.rb +34 -51
- data/test/unit/regexp/test_arity.rb +14 -29
- data/test/unit/string/test_align.rb +13 -27
- data/test/unit/string/test_blank.rb +12 -27
- data/test/unit/string/test_bracket.rb +52 -67
- data/test/unit/string/test_case.rb +19 -38
- data/test/unit/string/test_crypt.rb +10 -25
- data/test/unit/string/test_filter.rb +1 -7
- data/test/unit/string/test_format.rb +2 -7
- data/test/unit/string/test_indexable.rb +54 -69
- data/test/unit/string/test_interpolate.rb +8 -21
- data/test/unit/string/test_natcmp.rb +11 -26
- data/test/unit/string/test_nchar.rb +1 -14
- data/test/unit/string/test_op.rb +14 -0
- data/test/unit/string/test_partitions.rb +39 -54
- data/test/unit/string/test_range.rb +17 -32
- data/test/unit/string/test_regesc.rb +1 -7
- data/test/unit/string/test_scan.rb +23 -38
- data/test/unit/string/test_stackable.rb +79 -98
- data/test/unit/string/test_tabs.rb +1 -7
- data/test/unit/symbol/test_chomp.rb +10 -21
- data/test/unit/symbol/test_generate.rb +7 -22
- data/test/unit/symbol/test_not.rb +10 -25
- data/test/unit/symbol/test_shadow.rb +8 -23
- data/test/unit/symbol/test_succ.rb +1 -7
- data/test/unit/symbol/test_to_proc.rb +1 -7
- data/test/unit/test_attributes.rb +1 -1
- data/test/unit/test_continuation.rb +13 -0
- data/test/unit/test_conversion.rb +1 -14
- data/test/unit/test_namespace.rb +30 -3
- data/test/unit/test_thread.rb +23 -0
- data/test/unit/time/test_change.rb +11 -26
- data/test/unit/time/test_elapse.rb +10 -25
- data/test/unit/time/test_stamp.rb +28 -0
- metadata +65 -25
- data/lib/core/facets/array/unzip.rb +0 -14
- data/lib/core/facets/continuation.rb +0 -1
- data/lib/core/facets/enumerable/collate.rb +0 -104
- data/lib/core/facets/kernel/require_esc.rb +0 -44
- data/lib/more/facets/mapsend.rb +0 -98
- data/lib/more/facets/pp_s.rb +0 -30
- data/log/history.rd +0 -38
- data/log/todo.rd +0 -4
- data/task/special/quickopts +0 -15
- data/test/unit/continuation/test_create.rb +0 -28
- data/test/unit/enumerable/test_collate.rb +0 -51
- data/test/unit/kernel/test_require_esc.rb +0 -29
- data/test/unit/test_mapsend.rb +0 -18
- data/test/unit/test_pp_s.rb +0 -17
@@ -1,30 +1,25 @@
|
|
1
|
-
# TITLE:
|
2
|
-
#
|
1
|
+
# = TITLE:
|
3
2
|
# Super/As Extensions
|
4
3
|
#
|
5
|
-
# DESCRIPTION:
|
6
|
-
#
|
4
|
+
# = DESCRIPTION:
|
7
5
|
# Extensions for calling ancestor methods.
|
8
6
|
#
|
9
|
-
# AUTHORS:
|
10
|
-
#
|
7
|
+
# = AUTHORS:
|
11
8
|
# CREDIT Thomas Sawyer
|
12
9
|
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
# -
|
16
|
-
# - LOG 2006-11-04 trans@gmail.com Now #as can take a block.
|
10
|
+
# = LOG:
|
11
|
+
# - 2006-11-04 trans@gmail.com Use own delegator instead of Functor.
|
12
|
+
# - 2006-11-04 trans@gmail.com Now #as can take a block.
|
17
13
|
#
|
18
|
-
#
|
14
|
+
# = TODO:
|
19
15
|
#
|
20
|
-
# -
|
16
|
+
# - Probably get rid of __self__ or get a new name.
|
21
17
|
# It is similar to #meta + #as, but just for Object/Kernel.
|
22
18
|
#
|
23
|
-
# -
|
19
|
+
# - Deprecatee either #super_method or #supermethod.
|
24
20
|
|
25
21
|
require 'facets/functor'
|
26
22
|
|
27
|
-
#
|
28
23
|
module Kernel
|
29
24
|
|
30
25
|
# Returns a Functor that allows one to call any
|
@@ -42,6 +37,7 @@ module Kernel
|
|
42
37
|
#
|
43
38
|
# NOTE: This has been through a couple of renamings,
|
44
39
|
# including #__object__, #__self__, and #self.
|
40
|
+
|
45
41
|
def __real__
|
46
42
|
@__real__ ||= Functor.new do |meth, *args| # &blk|
|
47
43
|
Object.instance_method(meth).bind(self).call(*args) # ,&blk)
|
@@ -76,6 +72,7 @@ module Kernel
|
|
76
72
|
end
|
77
73
|
|
78
74
|
# Call parent class/module methods once bound to self.
|
75
|
+
|
79
76
|
def send_as(ancestor, sym, *args, &blk)
|
80
77
|
ancestor.instance_method(sym).bind(self).call(*args,&blk)
|
81
78
|
end
|
@@ -148,7 +145,7 @@ end
|
|
148
145
|
|
149
146
|
class As #:nodoc:
|
150
147
|
# Privatize all methods except #binding an operators.
|
151
|
-
private
|
148
|
+
private(*instance_methods.select { |m| m !~ /(^__|^\W|^binding$)/ })
|
152
149
|
|
153
150
|
def initialize(subject, ancestor)
|
154
151
|
@subject = subject
|
@@ -159,64 +156,3 @@ class As #:nodoc:
|
|
159
156
|
@ancestor.instance_method(sym).bind(@subject).call(*args,&blk)
|
160
157
|
end
|
161
158
|
end
|
162
|
-
|
163
|
-
|
164
|
-
# _____ _
|
165
|
-
# |_ _|__ ___| |_
|
166
|
-
# | |/ _ \/ __| __|
|
167
|
-
# | | __/\__ \ |_
|
168
|
-
# |_|\___||___/\__|
|
169
|
-
#
|
170
|
-
=begin test
|
171
|
-
|
172
|
-
require 'test/unit'
|
173
|
-
|
174
|
-
class TestKernelSuper < Test::Unit::TestCase
|
175
|
-
|
176
|
-
class X ; def x ; 1 ; end ; end
|
177
|
-
class Y < X ; def x ; 2 ; end ; end
|
178
|
-
class Z < Y ; def x ; superior(X) ; end ; end
|
179
|
-
|
180
|
-
def test_superior
|
181
|
-
z = Z.new
|
182
|
-
assert_equal( 1, z.x )
|
183
|
-
end
|
184
|
-
|
185
|
-
class X2 ; def x ; 1 ; end ; end
|
186
|
-
class Y2 < X2 ; def x ; 2 ; end ; end
|
187
|
-
class Z2 < Y2 ; def x ; 3 ; end ; end
|
188
|
-
|
189
|
-
def test_super_method
|
190
|
-
x = X2.new
|
191
|
-
z = Z2.new
|
192
|
-
s0 = x.method( :x )
|
193
|
-
s1 = z.super_method( X2, :x )
|
194
|
-
assert_equal( s0.call, s1.call )
|
195
|
-
end
|
196
|
-
|
197
|
-
class A
|
198
|
-
def x; "A.x"; end
|
199
|
-
def y; "A.y"; end
|
200
|
-
end
|
201
|
-
class B < A
|
202
|
-
def x; "B.x" end
|
203
|
-
def y; "B.y" end
|
204
|
-
end
|
205
|
-
class C < B
|
206
|
-
def x; "C.x"; end
|
207
|
-
def y; as(B).x ; end
|
208
|
-
end
|
209
|
-
|
210
|
-
def test_as
|
211
|
-
c = C.new
|
212
|
-
assert_equal("B.x", c.y)
|
213
|
-
assert_equal("C.x", c.x)
|
214
|
-
end
|
215
|
-
|
216
|
-
def test_send_as
|
217
|
-
assert_equal( String, "A".send_as(Object, :class) )
|
218
|
-
end
|
219
|
-
|
220
|
-
end
|
221
|
-
|
222
|
-
=end
|
@@ -1,116 +1,34 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
# K-Combinators, Tap and Returning
|
4
|
-
#
|
5
|
-
# SUMMARY:
|
6
|
-
#
|
7
|
-
# Veriations on K-Combinator, namely #tap and
|
8
|
-
# #returning, and returning's alias #with.
|
9
|
-
#
|
10
|
-
# AUTHORS:
|
11
|
-
#
|
12
|
-
# - Mikael Brockman
|
13
|
-
# -Thomas Sawyer
|
1
|
+
# DEPRECATE for 1.9.
|
2
|
+
unless (RUBY_VERSION[0,3] == '1.9')
|
14
3
|
|
15
|
-
|
16
|
-
module Kernel
|
4
|
+
module Kernel
|
17
5
|
|
18
|
-
|
6
|
+
# The tap K-Combinator. This yields self -and- returns self.
|
7
|
+
#
|
8
|
+
# CREDIT: ?
|
19
9
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
24
|
-
self
|
25
|
-
end
|
26
|
-
|
27
|
-
# require 'facets/functor'
|
28
|
-
#
|
29
|
-
# # Yield self -and- return self.
|
30
|
-
#
|
31
|
-
# def tap(&b)
|
32
|
-
# if block_given?
|
33
|
-
# b.arity == 1 ? yield(self) : instance_eval(&b)
|
34
|
-
# self
|
35
|
-
# else
|
36
|
-
# Functor.new{ |op, *args| self.send(op, *args); self }
|
37
|
-
# end
|
38
|
-
# end
|
39
|
-
|
40
|
-
# A Ruby-ized realization of the K combinator.
|
41
|
-
#
|
42
|
-
# returning Book.new do |book|
|
43
|
-
# book.title = "Imperium"
|
44
|
-
# book.author = "Ulick Varange"
|
45
|
-
# end
|
46
|
-
#
|
47
|
-
# Also aliased as #with.
|
48
|
-
#
|
49
|
-
# def foo
|
50
|
-
# with values = [] do
|
51
|
-
# values << 'bar'
|
52
|
-
# values << 'baz'
|
53
|
-
# end
|
54
|
-
# end
|
55
|
-
#
|
56
|
-
# foo # => ['bar', 'baz']
|
57
|
-
#
|
58
|
-
# Technically, #returning probably should force the return of
|
59
|
-
# the stated object irregardless of any return statements that
|
60
|
-
# might appear within it's block. This might differentiate
|
61
|
-
# #returning from #with, however it also would require
|
62
|
-
# implementation in Ruby itself.
|
63
|
-
|
64
|
-
def returning(obj=self)
|
65
|
-
yield obj
|
66
|
-
obj
|
67
|
-
end
|
68
|
-
|
69
|
-
alias :with :returning
|
70
|
-
|
71
|
-
# Repeat loop until it yeilds false or nil.
|
72
|
-
|
73
|
-
def complete
|
74
|
-
loop { break unless yield }
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
# _____ _
|
82
|
-
# |_ _|__ ___| |_
|
83
|
-
# | |/ _ \/ __| __|
|
84
|
-
# | | __/\__ \ |_
|
85
|
-
# |_|\___||___/\__|
|
86
|
-
#
|
87
|
-
=begin test
|
88
|
-
|
89
|
-
require 'test/unit'
|
90
|
-
|
91
|
-
class TCKernel < Test::Unit::TestCase
|
92
|
-
|
93
|
-
def test_returning
|
94
|
-
foo = returning( values = [] ) do
|
95
|
-
values << 'bar'
|
96
|
-
values << 'baz'
|
10
|
+
def tap(&b)
|
11
|
+
if block_given?
|
12
|
+
b.arity == 1 ? yield(self) : instance_eval(&b)
|
97
13
|
end
|
98
|
-
|
14
|
+
self
|
99
15
|
end
|
100
16
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
def
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
17
|
+
# This is just an odd consideration for #tap using Functor:
|
18
|
+
#
|
19
|
+
# require 'facets/functor'
|
20
|
+
#
|
21
|
+
# # Yield self -and- return self.
|
22
|
+
#
|
23
|
+
# def tap(&b)
|
24
|
+
# if block_given?
|
25
|
+
# b.arity == 1 ? yield(self) : instance_eval(&b)
|
26
|
+
# self
|
27
|
+
# else
|
28
|
+
# Functor.new{ |op, *args| self.send(op, *args); self }
|
29
|
+
# end
|
30
|
+
# end
|
113
31
|
|
114
32
|
end
|
115
33
|
|
116
|
-
|
34
|
+
end
|
@@ -4,6 +4,11 @@ module Kernel
|
|
4
4
|
# is considered to have value if it is not nil?
|
5
5
|
# and if it responds to #empty?, is not empty.
|
6
6
|
#
|
7
|
+
# nil.val? #=> false
|
8
|
+
# [].val? #=> false
|
9
|
+
# 10.val? #=> true
|
10
|
+
# [nil].val? #=> true
|
11
|
+
|
7
12
|
def val?
|
8
13
|
return false if nil?
|
9
14
|
return false if empty? if respond_to?(:empty?)
|
@@ -15,14 +20,13 @@ module Kernel
|
|
15
20
|
# "hello".not_nil? # -> true
|
16
21
|
# nil.not_nil? # -> false
|
17
22
|
#
|
18
|
-
# CREDIT Gavin Sinclair
|
23
|
+
# CREDIT: Gavin Sinclair
|
19
24
|
|
20
25
|
def not_nil?
|
21
26
|
not nil?
|
22
27
|
end
|
23
28
|
|
24
|
-
|
25
|
-
#alias_method :non_nil?, :not_nil?
|
29
|
+
alias_method :non_nil?, :not_nil?
|
26
30
|
|
27
31
|
# Is self included in other?
|
28
32
|
#
|
@@ -34,46 +38,3 @@ module Kernel
|
|
34
38
|
end
|
35
39
|
|
36
40
|
end
|
37
|
-
|
38
|
-
|
39
|
-
# _____ _
|
40
|
-
# |_ _|__ ___| |_
|
41
|
-
# | |/ _ \/ __| __|
|
42
|
-
# | | __/\__ \ |_
|
43
|
-
# |_|\___||___/\__|
|
44
|
-
#
|
45
|
-
=begin test
|
46
|
-
|
47
|
-
require 'test/unit'
|
48
|
-
|
49
|
-
class TestKernelVal < Test::Unit::TestCase
|
50
|
-
|
51
|
-
def test_val_1
|
52
|
-
f = nil
|
53
|
-
t = 1
|
54
|
-
assert( ! f.val? )
|
55
|
-
assert( t.val? )
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_val_2
|
59
|
-
f = []
|
60
|
-
t = [1]
|
61
|
-
assert( ! f.val? )
|
62
|
-
assert( t.val? )
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_val_3
|
66
|
-
f = ''
|
67
|
-
t = '1'
|
68
|
-
assert( ! f.val? )
|
69
|
-
assert( t.val? )
|
70
|
-
end
|
71
|
-
|
72
|
-
def test_in?
|
73
|
-
assert( 5.in?(0..10) )
|
74
|
-
assert( 5.in?([1,2,3,4,5]) )
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|
78
|
-
|
79
|
-
=end
|
@@ -1,21 +1,3 @@
|
|
1
|
-
# FILE:
|
2
|
-
#
|
3
|
-
# kernel/with.rb
|
4
|
-
#
|
5
|
-
# DESCRIPTION:
|
6
|
-
#
|
7
|
-
# With-accessors create singleton attributes.
|
8
|
-
#
|
9
|
-
# AUTHORS:
|
10
|
-
#
|
11
|
-
# CREDIT THomas Sawyer
|
12
|
-
#
|
13
|
-
# NOTES:
|
14
|
-
#
|
15
|
-
# TODO Consider the use cases of these, and at the very
|
16
|
-
# least find new names.
|
17
|
-
|
18
|
-
#
|
19
1
|
class Object
|
20
2
|
|
21
3
|
# Takes a hash and creates (singleton) attr_readers for each key.
|
@@ -26,6 +8,8 @@ class Object
|
|
26
8
|
# self.x #=> 1
|
27
9
|
# self.y #=> 2
|
28
10
|
#
|
11
|
+
# CREDIT: Trans
|
12
|
+
|
29
13
|
def with_reader(h)
|
30
14
|
(class << self ; self ; end).send( :attr_reader, *h.keys )
|
31
15
|
h.each { |k,v| instance_variable_set("@#{k}", v) }
|
@@ -41,6 +25,8 @@ class Object
|
|
41
25
|
# @x #=> 3
|
42
26
|
# @y #=> 4
|
43
27
|
#
|
28
|
+
# CREDIT: Trans
|
29
|
+
|
44
30
|
def with_writer(h)
|
45
31
|
(class << self ; self ; end).send( :attr_writer, *h.keys )
|
46
32
|
h.each { |k,v| instance_variable_set("@#{k}", v) }
|
@@ -57,55 +43,11 @@ class Object
|
|
57
43
|
# self.x #=> 3
|
58
44
|
# self.y #=> 4
|
59
45
|
#
|
46
|
+
# CREDIT: Trans
|
47
|
+
|
60
48
|
def with_accessor(h)
|
61
49
|
(class << self ; self ; end).send( :attr_accessor, *h.keys )
|
62
50
|
h.each { |k,v| instance_variable_set("@#{k}", v) }
|
63
51
|
end
|
64
52
|
|
65
53
|
end
|
66
|
-
|
67
|
-
|
68
|
-
# _____ _
|
69
|
-
# |_ _|__ ___| |_
|
70
|
-
# | |/ _ \/ __| __|
|
71
|
-
# | | __/\__ \ |_
|
72
|
-
# |_|\___||___/\__|
|
73
|
-
#
|
74
|
-
=begin test
|
75
|
-
|
76
|
-
require 'test/unit'
|
77
|
-
|
78
|
-
class TCKernel < Test::Unit::TestCase
|
79
|
-
# fixture for #with_reader, #with_writer and #with_accessor
|
80
|
-
class TestWith
|
81
|
-
def initialize
|
82
|
-
with_reader :foo => "FOO"
|
83
|
-
with_writer :bar => "BAR"
|
84
|
-
with_accessor :baz => "BAZ"
|
85
|
-
end
|
86
|
-
def get_bar
|
87
|
-
@bar
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def test_with_reader
|
92
|
-
assert_nothing_raised { @t = TestWith.new }
|
93
|
-
assert_equal("FOO", @t.foo)
|
94
|
-
end
|
95
|
-
|
96
|
-
def test_with_writer
|
97
|
-
assert_nothing_raised { @t = TestWith.new }
|
98
|
-
assert_equal("BAR", @t.get_bar)
|
99
|
-
@t.bar = "BAR2"
|
100
|
-
assert_equal("BAR2", @t.get_bar)
|
101
|
-
end
|
102
|
-
|
103
|
-
def test_with_accessor
|
104
|
-
assert_nothing_raised { @t = TestWith.new }
|
105
|
-
assert_equal("BAZ", @t.baz)
|
106
|
-
@t.baz = "BAZ2"
|
107
|
-
assert_equal("BAZ2", @t.baz)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
=end
|
@@ -1,23 +1,14 @@
|
|
1
|
-
# TITLE:
|
2
|
-
# Matchset
|
3
|
-
#
|
4
|
-
# DESCRIPTION:
|
5
|
-
# Matchdata methods to produces a hierachical list of a match result.
|
6
|
-
# This also includes Regexp#arity.
|
7
|
-
#
|
8
|
-
# AUTHORS:
|
9
|
-
# - Thomas Sawyer
|
10
|
-
|
11
|
-
#
|
12
1
|
class MatchData
|
13
2
|
|
14
|
-
# TODO Is MatchData#match really worth having? It's kind of confusing w/ Regexp#match.
|
15
|
-
|
16
3
|
# Return the primary match string. This is equivalent to +md[0]+.
|
17
4
|
#
|
18
5
|
# md = /123/.match "123456"
|
19
6
|
# md.match #=> "123"
|
20
7
|
#
|
8
|
+
# TODO: Is MatchData#match really worth having? It's kind of confusing w/ Regexp#match.
|
9
|
+
#
|
10
|
+
# CREDIT: Trans
|
11
|
+
|
21
12
|
def match
|
22
13
|
self[0]
|
23
14
|
end
|
@@ -28,6 +19,8 @@ class MatchData
|
|
28
19
|
# md.to_a #=> ["XXaabbccddeeffXX", "bb", "ccdd", "dd", "ee"]
|
29
20
|
# md.matchset #=> ["XXaa", [["bb"], ["cc", ["dd"]], "ee"], "ffXX"]
|
30
21
|
#
|
22
|
+
# CREDIT: Trans
|
23
|
+
|
31
24
|
def matchset
|
32
25
|
[pre_match, matchtree, post_match]
|
33
26
|
end
|
@@ -39,6 +32,8 @@ class MatchData
|
|
39
32
|
# md.to_a #=> ["XXaabbccddeeffXX", "bb", "ccdd", "dd", "ee"]
|
40
33
|
# md.matchtree #=> [["bb"], ["cc", ["dd"]], "ee"]
|
41
34
|
#
|
35
|
+
# CREDIT: Trans
|
36
|
+
|
42
37
|
def matchtree(index=0)
|
43
38
|
ret=[]
|
44
39
|
b, e=self.begin(index), self.end(index)
|
@@ -59,40 +54,3 @@ class MatchData
|
|
59
54
|
end
|
60
55
|
|
61
56
|
end
|
62
|
-
|
63
|
-
|
64
|
-
# _____ _
|
65
|
-
# |_ _|__ ___| |_
|
66
|
-
# | |/ _ \/ __| __|
|
67
|
-
# | | __/\__ \ |_
|
68
|
-
# |_|\___||___/\__|
|
69
|
-
#
|
70
|
-
=begin test
|
71
|
-
|
72
|
-
require 'test/unit'
|
73
|
-
|
74
|
-
class TestMatchData < Test::Unit::TestCase
|
75
|
-
|
76
|
-
def test_match
|
77
|
-
md = /X(a)(b)(c)X/.match("YXabcXY")
|
78
|
-
assert_equal( "XabcX", md.match )
|
79
|
-
end
|
80
|
-
|
81
|
-
def test_matchtree_01
|
82
|
-
md = /(bb)(cc(dd))(ee)/.match "XXaabbccddeeffXX"
|
83
|
-
assert_equal( [["bb"], ["cc", ["dd"]], ["ee"]] , md.matchtree )
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_matchtree_02
|
87
|
-
md = /(bb)c(c(dd))(ee)/.match "XXaabbccddeeffXX"
|
88
|
-
assert_equal( [["bb"], "c", ["c", ["dd"]], ["ee"]] , md.matchtree )
|
89
|
-
end
|
90
|
-
|
91
|
-
def test_matchset
|
92
|
-
md = /(bb)(cc(dd))(ee)/.match "XXaabbccddeeffXX"
|
93
|
-
assert_equal( ["XXaa", [["bb"], ["cc", ["dd"]], ["ee"]], "ffXX"] , md.matchset )
|
94
|
-
end
|
95
|
-
|
96
|
-
end
|
97
|
-
|
98
|
-
=end
|