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,22 +1,14 @@
|
|
1
|
-
# TITLE:
|
2
|
-
# Proc Bind
|
3
|
-
#
|
4
|
-
# LOG:
|
5
|
-
# - 2006-12-27 (trans) Deprecated use of TemporaryMethods module
|
6
|
-
|
7
|
-
#
|
8
1
|
class Proc
|
9
2
|
|
10
|
-
# Bind a
|
3
|
+
# Bind a Proc to an object returning a Method.
|
11
4
|
#
|
12
5
|
# The block's #to_s method (same as #inspect) is
|
13
6
|
# used for the temporary method label defined in
|
14
7
|
# the Object class.
|
15
8
|
#
|
16
|
-
#
|
17
|
-
|
18
|
-
|
19
|
-
#++
|
9
|
+
# NOTE: This dynamically loads thread.so if used.
|
10
|
+
# NOTE: Not so sure it is thread critical anymore.
|
11
|
+
|
20
12
|
def bind(object=nil)
|
21
13
|
require 'thread'
|
22
14
|
|
@@ -39,11 +31,22 @@ class Proc
|
|
39
31
|
end
|
40
32
|
Thread.critical = old
|
41
33
|
end
|
34
|
+
|
42
35
|
return meth
|
43
36
|
end
|
44
37
|
|
45
38
|
# Convert Proc to method.
|
46
39
|
#
|
40
|
+
# Class X; end
|
41
|
+
#
|
42
|
+
# plusproc = lambda { |x| x + 1 }
|
43
|
+
# plusproc.to_method('foo', X)
|
44
|
+
# X.new.foo(1) #=> 2
|
45
|
+
#
|
46
|
+
# TODO: Should use singleton instead of object.class ?
|
47
|
+
#
|
48
|
+
# CREDIT: Trans
|
49
|
+
|
47
50
|
def to_method(name=nil, object=nil)
|
48
51
|
return bind unless name
|
49
52
|
|
@@ -57,51 +60,5 @@ class Proc
|
|
57
60
|
|
58
61
|
object.method(name)
|
59
62
|
end
|
60
|
-
end
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
# _____ _
|
66
|
-
# |_ _|__ ___| |_
|
67
|
-
# | |/ _ \/ __| __|
|
68
|
-
# | | __/\__ \ |_
|
69
|
-
# |_|\___||___/\__|
|
70
|
-
#
|
71
|
-
=begin test
|
72
|
-
|
73
|
-
require 'test/unit'
|
74
|
-
|
75
|
-
class TestProc < Test::Unit::TestCase
|
76
|
-
|
77
|
-
def test_to_method
|
78
|
-
a = 2
|
79
|
-
tproc = proc { |x| x + a }
|
80
|
-
tmethod = tproc.to_method(:tryit)
|
81
|
-
assert_equal( 3, tmethod.call(1) )
|
82
|
-
assert_respond_to( self, :tryit )
|
83
|
-
assert_equal( 3, tryit(1) )
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_memory_leak
|
87
|
-
a = 2
|
88
|
-
tproc = lambda { |x| x + a }
|
89
|
-
100.times {
|
90
|
-
tmethod = tproc.to_method
|
91
|
-
assert_equal( 3, tmethod.call(1) )
|
92
|
-
}
|
93
|
-
meths = (
|
94
|
-
Object.instance_methods +
|
95
|
-
Object.public_instance_methods +
|
96
|
-
Object.private_instance_methods +
|
97
|
-
Object.protected_instance_methods
|
98
|
-
)
|
99
|
-
meths = meths.select{ |s| s.to_s =~ /^_bind_/ }
|
100
|
-
#meths = Symbol.all_symbols.select { |s| s.to_s =~ /^_bind_/ } # why ?
|
101
|
-
assert_equal( 0, meths.size )
|
102
|
-
end
|
103
|
-
|
104
|
-
end
|
105
|
-
|
106
|
-
=end
|
107
63
|
|
64
|
+
end
|
@@ -9,7 +9,7 @@ class Proc
|
|
9
9
|
# a.compose(b).call(4) #=> 6
|
10
10
|
# b.compose(a).call(4) #=> 4
|
11
11
|
#
|
12
|
-
#
|
12
|
+
# CREDIT: Dave
|
13
13
|
|
14
14
|
def compose(g)
|
15
15
|
raise ArgumentError, "arity count mismatch" unless arity == g.arity
|
@@ -24,12 +24,14 @@ class Proc
|
|
24
24
|
# (a * b).call(4) #=> 6
|
25
25
|
# (b * a).call(4) #=> 4
|
26
26
|
#
|
27
|
-
#
|
27
|
+
# CREDIT: Dave
|
28
28
|
|
29
29
|
def *(x)
|
30
30
|
if Integer===x
|
31
31
|
# collect times
|
32
|
-
|
32
|
+
c = []
|
33
|
+
x.times{|i| c << call(i)}
|
34
|
+
c
|
33
35
|
else
|
34
36
|
# compose procs
|
35
37
|
lambda{|*a| self[x[*a]]}
|
@@ -38,44 +40,8 @@ class Proc
|
|
38
40
|
|
39
41
|
# Use a Proc as an observable.
|
40
42
|
#
|
41
|
-
#
|
43
|
+
# CREDIT: Tim Pease
|
42
44
|
|
43
45
|
alias_method :update, :call
|
44
46
|
|
45
47
|
end
|
46
|
-
|
47
|
-
|
48
|
-
# _____ _
|
49
|
-
# |_ _|__ ___| |_
|
50
|
-
# | |/ _ \/ __| __|
|
51
|
-
# | | __/\__ \ |_
|
52
|
-
# |_|\___||___/\__|
|
53
|
-
#
|
54
|
-
=begin test
|
55
|
-
|
56
|
-
require 'test/unit'
|
57
|
-
|
58
|
-
class TestProc < Test::Unit::TestCase
|
59
|
-
|
60
|
-
def test_compose_op
|
61
|
-
a = lambda { |x| x + 4 }
|
62
|
-
b = lambda { |y| y / 2 }
|
63
|
-
assert_equal( 6, (a * b).call(4) )
|
64
|
-
assert_equal( 4, (b * a).call(4) )
|
65
|
-
end
|
66
|
-
|
67
|
-
def test_times_collect_op
|
68
|
-
a = lambda { |x| x + 4 }
|
69
|
-
assert_equal( [4,5,6], a * 3 )
|
70
|
-
end
|
71
|
-
|
72
|
-
def test_compose
|
73
|
-
a = lambda { |x| x + 4 }
|
74
|
-
b = lambda { |y| y / 2 }
|
75
|
-
assert_equal( 6, (a.compose(b)).call(4) )
|
76
|
-
assert_equal( 4, (b.compose(a)).call(4) )
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
80
|
-
|
81
|
-
=end
|
data/lib/core/facets/proc/fn.rb
CHANGED
@@ -1,24 +1,11 @@
|
|
1
|
-
# = FILE
|
2
|
-
#
|
3
|
-
# combine.rb
|
4
|
-
#
|
5
|
-
# = DESCRIPTION
|
6
|
-
#
|
7
|
-
# Range extensions for combination.
|
8
|
-
#
|
9
|
-
# = AUTHORS
|
10
|
-
#
|
11
|
-
# CREDIT Daniel Schierbeck
|
12
|
-
# CREDIT Brandon Keepers
|
13
|
-
#
|
14
|
-
# = NOTES
|
15
|
-
#
|
16
|
-
# TODO Incorporate end sentinal inclusion vs. exclusion in #combine.
|
17
|
-
|
18
|
-
#
|
19
1
|
class Range
|
20
2
|
|
21
3
|
# Combine intervals.
|
4
|
+
#
|
5
|
+
# Range.combine(1..2, 2..4) #=> [1..4]
|
6
|
+
# Range.combine(1..2, 3..4) #=> [1..2, 3..4]
|
7
|
+
#
|
8
|
+
# CREDIT: Trans
|
22
9
|
|
23
10
|
def self.combine(*intervals)
|
24
11
|
intype = intervals.first.class
|
@@ -28,13 +15,13 @@ class Range
|
|
28
15
|
[i.first, i.last]
|
29
16
|
end
|
30
17
|
|
31
|
-
intervals.sort.inject([]) do |result,
|
18
|
+
intervals.sort.each do |(from, to)| #inject([]) do |result,
|
32
19
|
if result.empty? or from > result.last[1]
|
33
20
|
result << [from, to]
|
34
21
|
elsif to > result.last[1]
|
35
22
|
result.last[1] = to
|
36
23
|
end
|
37
|
-
result
|
24
|
+
#result
|
38
25
|
end
|
39
26
|
|
40
27
|
if intype <= Range
|
@@ -44,40 +31,17 @@ class Range
|
|
44
31
|
end
|
45
32
|
end
|
46
33
|
|
47
|
-
# Combine
|
34
|
+
# Combine ranges.
|
35
|
+
#
|
36
|
+
# (1..2).combine(2..4) #=> [1..4]
|
37
|
+
# (1..2).combine(3..4) #=> [1..2, 3..4]
|
38
|
+
#
|
39
|
+
# TODO: Incorporate end-sentinal inclusion vs. exclusion.
|
40
|
+
#
|
41
|
+
# CREDIT: Trans
|
48
42
|
|
49
43
|
def combine(*intervals)
|
50
44
|
Range.combine(self, *intervals)
|
51
45
|
end
|
52
46
|
|
53
47
|
end
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
# _____ _
|
58
|
-
# |_ _|__ ___| |_
|
59
|
-
# | |/ _ \/ __| __|
|
60
|
-
# | | __/\__ \ |_
|
61
|
-
# |_|\___||___/\__|
|
62
|
-
#
|
63
|
-
=begin test
|
64
|
-
|
65
|
-
require 'test/unit'
|
66
|
-
|
67
|
-
class TestRangeCombine < Test::Unit::TestCase
|
68
|
-
|
69
|
-
def test_combine_ranges
|
70
|
-
r = Range.combine(0..4, 2..6, 6..10, 13..17, 12..19)
|
71
|
-
x = [0..10, 12..19]
|
72
|
-
assert_equal(x, r)
|
73
|
-
end
|
74
|
-
|
75
|
-
def test_combine_arrays_as_intervals
|
76
|
-
r = Range.combine([0, 4], [2, 6], [6, 10], [13, 17], [12, 19])
|
77
|
-
x = [[0, 10], [12, 19]]
|
78
|
-
assert_equal(x, r)
|
79
|
-
end
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
=end
|
@@ -1,20 +1,9 @@
|
|
1
|
-
# = FILE
|
2
|
-
#
|
3
|
-
# overlap.rb
|
4
|
-
#
|
5
|
-
# = DESCRIPTION
|
6
|
-
#
|
7
|
-
# Range extensions for overlap comparison.
|
8
|
-
#
|
9
|
-
# = AUTHORS
|
10
|
-
#
|
11
|
-
# CREDIT Daniel Schierbeck
|
12
|
-
# CREDIT Brandon Keepers
|
13
|
-
|
14
|
-
#
|
15
1
|
class Range
|
16
2
|
|
17
3
|
# Do two ranges overlap?
|
4
|
+
#
|
5
|
+
# CREDIT: Daniel Schierbeck
|
6
|
+
# CREDIT: Brandon Keepers
|
18
7
|
|
19
8
|
def overlap?(other)
|
20
9
|
include?(other.first) or other.include?(first)
|
@@ -48,6 +37,9 @@ class Range
|
|
48
37
|
#
|
49
38
|
# (0..3).umbrella(1..2) #=> [-1,-1]
|
50
39
|
#
|
40
|
+
# CREDIT: Trans
|
41
|
+
# CREDIT: Chris Kappler
|
42
|
+
|
51
43
|
def umbrella(r)
|
52
44
|
s = first <=> r.first
|
53
45
|
e = r.last <=> last
|
@@ -68,6 +60,8 @@ class Range
|
|
68
60
|
#
|
69
61
|
# (1..3).within?(0..4) #=> true
|
70
62
|
#
|
63
|
+
# CREDIT: Trans
|
64
|
+
|
71
65
|
def within?(rng)
|
72
66
|
case rng.umbrella(self)
|
73
67
|
when [0,0], [-1,0], [0,-1], [-1,-1]
|
@@ -78,53 +72,3 @@ class Range
|
|
78
72
|
end
|
79
73
|
|
80
74
|
end
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
# _____ _
|
85
|
-
# |_ _|__ ___| |_
|
86
|
-
# | |/ _ \/ __| __|
|
87
|
-
# | | __/\__ \ |_
|
88
|
-
# |_|\___||___/\__|
|
89
|
-
#
|
90
|
-
=begin test
|
91
|
-
|
92
|
-
require 'test/unit'
|
93
|
-
|
94
|
-
class TestRangeOverlap < Test::Unit::TestCase
|
95
|
-
|
96
|
-
def test_umbrella_aligned
|
97
|
-
assert_equal( [0,0], (3..6).umbrella(3..6) )
|
98
|
-
assert_equal( [0,0], (3...6).umbrella(3...6) )
|
99
|
-
end
|
100
|
-
|
101
|
-
def test_umbrella_partial_aligned
|
102
|
-
assert_equal( [1,0], (3..6).umbrella(2..6) )
|
103
|
-
assert_equal( [0,1], (3..6).umbrella(3..7) )
|
104
|
-
assert_equal( [-1,0], (3..6).umbrella(4..6) )
|
105
|
-
assert_equal( [0,-1], (3..6).umbrella(3..5) )
|
106
|
-
end
|
107
|
-
|
108
|
-
def test_umbrella_offset
|
109
|
-
assert_equal( [1,1], (3..6).umbrella(2..7) )
|
110
|
-
assert_equal( [-1,1], (3..6).umbrella(4..7) )
|
111
|
-
assert_equal( [1,-1], (3..6).umbrella(2..5) )
|
112
|
-
assert_equal( [-1,-1], (3..6).umbrella(4..5) )
|
113
|
-
end
|
114
|
-
|
115
|
-
def test_umbrella_offset_by_exclusion
|
116
|
-
$xx = true
|
117
|
-
assert_equal( [0,1], (10...20).umbrella(10..20) )
|
118
|
-
$xx = false
|
119
|
-
end
|
120
|
-
|
121
|
-
def test_within?
|
122
|
-
assert( (4..5).within?(3..6) )
|
123
|
-
assert( (3..6).within?(3..6) )
|
124
|
-
assert(! (2..5).within?(3..6) )
|
125
|
-
assert(! (5..7).within?(3..6) )
|
126
|
-
end
|
127
|
-
|
128
|
-
end
|
129
|
-
|
130
|
-
=end
|
@@ -1,52 +1,17 @@
|
|
1
|
-
# TITLE:
|
2
|
-
# Regexp Arity
|
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 Regexp
|
2
|
+
|
13
3
|
# Returns the number of backreferencing subexpressions.
|
14
4
|
#
|
15
5
|
# /(a)(b)(c)/.arity #=> 3
|
16
6
|
# /(a(b(c)))/.arity #=> 3
|
17
7
|
#
|
18
|
-
# Note
|
8
|
+
# Note that this is not perfect, especially with regards to \x
|
19
9
|
# and embedded comments.
|
10
|
+
#
|
11
|
+
# CREDIT: Trans
|
20
12
|
|
21
13
|
def arity
|
22
|
-
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
|
27
|
-
# _____ _
|
28
|
-
# |_ _|__ ___| |_
|
29
|
-
# | |/ _ \/ __| __|
|
30
|
-
# | | __/\__ \ |_
|
31
|
-
# |_|\___||___/\__|
|
32
|
-
#
|
33
|
-
=begin test
|
34
|
-
|
35
|
-
require 'test/unit'
|
36
|
-
|
37
|
-
class TestRegexpArity < Test::Unit::TestCase
|
38
|
-
|
39
|
-
def test_arity
|
40
|
-
r = /(1)(2)(3)/
|
41
|
-
assert_equal( 3, r.arity )
|
42
|
-
r = /(1)(2)(3)(4)/
|
43
|
-
assert_equal( 4, r.arity )
|
44
|
-
r = /(1)(2)((a)3)/
|
45
|
-
assert_equal( 4, r.arity )
|
46
|
-
r = /(?#nothing)(1)(2)(3)(?=3)/
|
47
|
-
assert_equal( 3, r.arity )
|
48
|
-
end
|
49
|
-
|
14
|
+
source.scan( /(?!\\)[(](?!\?[#=:!>-imx])/ ).length
|
50
15
|
end
|
51
16
|
|
52
|
-
|
17
|
+
end
|
@@ -1,27 +1,58 @@
|
|
1
|
-
# TITLE:
|
1
|
+
# = TITLE:
|
2
|
+
#
|
2
3
|
# Stackable
|
3
4
|
#
|
4
|
-
# DESCRIPTION:
|
5
|
-
#
|
5
|
+
# = DESCRIPTION:
|
6
|
+
#
|
7
|
+
# Stackable mixin provides #pop, #push, #pull, etc.
|
8
|
+
# It depends on #slice, #splice and #insert.
|
9
|
+
#
|
10
|
+
# = COPYRIGHT:
|
11
|
+
#
|
12
|
+
# Copyright (c) 2007 Thomas Sawyer
|
13
|
+
#
|
14
|
+
# Ruby License
|
15
|
+
#
|
16
|
+
# This module is free software. You may use, modify, and/or redistribute this
|
17
|
+
# software under the same terms as Ruby.
|
18
|
+
#
|
19
|
+
# This program is distributed in the hope that it will be useful, but WITHOUT
|
20
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
21
|
+
# FOR A PARTICULAR PURPOSE.
|
22
|
+
#
|
23
|
+
# = AUTHORS:
|
24
|
+
#
|
25
|
+
# - Thomas Sawyer
|
6
26
|
|
7
27
|
# Stackable mixin provides #pop, #push, #pull, etc.
|
8
28
|
# It depends on #slice, #splice and #insert.
|
9
29
|
|
10
30
|
module Stackable
|
11
31
|
|
32
|
+
# Pop item off stack.
|
12
33
|
#
|
34
|
+
# a = [1, 2, 3]
|
35
|
+
# a.pop #=> 3
|
36
|
+
# a #=> [1, 2]
|
13
37
|
|
14
38
|
def pop
|
15
39
|
splice(-1)
|
16
40
|
end
|
17
41
|
|
42
|
+
# Push item onto the stack.
|
18
43
|
#
|
44
|
+
# a = [1, 2]
|
45
|
+
# a.push(3) #=> [1, 2, 3]
|
19
46
|
|
20
47
|
def push(x)
|
21
48
|
insert(-1,x)
|
22
49
|
end
|
23
50
|
|
51
|
+
# Pull item off the stack.
|
24
52
|
#
|
53
|
+
# a = [1, 2, 3]
|
54
|
+
# a.pull #=> 1
|
55
|
+
# a #=> [2, 3]
|
25
56
|
|
26
57
|
def pull
|
27
58
|
slice(0)
|
@@ -29,7 +60,12 @@ module Stackable
|
|
29
60
|
|
30
61
|
alias_method :shift, :pull
|
31
62
|
|
63
|
+
# Poke item onto the stack.
|
32
64
|
#
|
65
|
+
# a = [2, 3]
|
66
|
+
# a.poke(1) #=> [1, 2, 3]
|
67
|
+
#
|
68
|
+
# TODO: Better name (besides unshift)?
|
33
69
|
|
34
70
|
def poke(x)
|
35
71
|
insert(0,x)
|
@@ -37,11 +73,14 @@ module Stackable
|
|
37
73
|
|
38
74
|
alias_method :unshift, :poke
|
39
75
|
|
76
|
+
# Peek at the top of the stack.
|
40
77
|
#
|
78
|
+
# a = [1, 2, 3]
|
79
|
+
# a.peek #=> 3
|
80
|
+
# a #=> [1, 2, 3]
|
41
81
|
|
42
82
|
def peek
|
43
83
|
splice(-1)
|
44
84
|
end
|
45
85
|
|
46
86
|
end
|
47
|
-
|