mores 0.1.2 → 0.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ddeb8c2e355c1b4aac2e5327f14d743788f478e6
4
- data.tar.gz: 619e001193d06a93af559d4f57351614760d16e7
3
+ metadata.gz: 3ece1af062ec702368bd3dc4c9566a79aa509135
4
+ data.tar.gz: 2e3ed10515d3c2994e284dcbe8216e9d8a7560c1
5
5
  SHA512:
6
- metadata.gz: 9a540d539229dae9c50f82e878be8991e58b25c7005ea23e9333500ce8161f370483f0c9d78d14567d822b1bd5d881f1f5ed430079b0714df568dba324e2ff3d
7
- data.tar.gz: 43f53567481437e6e04c809a7e7ee6462f204ed9807a6bfb557510b7ebcd3719a80a46f74e3480fad265be958c49a47b3d878003bfd4e01f702dbd22e1439077
6
+ metadata.gz: 88f5cdd6dd1e90e7369c44c933b6d4538409424fd7f67cdc0ac0724f31b5845ac19eefb91abf5a4938778ff72badf849b95d9900014bf58946a1b1d414a1c271
7
+ data.tar.gz: b541a546588535ad5615533f06248d23dbd8c9ced7c27a41b796c3924b68b7775f67b6e9e7a015427cc54e882d02418ceffe73ad95e6a003dd1319c41eec286e
@@ -0,0 +1,165 @@
1
+ module Mores
2
+
3
+ class LinkedList
4
+ include Enumerable
5
+
6
+ NOMATCH = BasicObject.new
7
+ private_constant :NOMATCH
8
+
9
+ attr_reader :length, :head, :tail
10
+ alias :size :length
11
+
12
+ def initialize
13
+ @length = 0
14
+ end
15
+
16
+ def empty?
17
+ !@head
18
+ end
19
+
20
+ def count(*args)
21
+ return @length if args.empty? && !block_given?
22
+ super
23
+ end
24
+
25
+ def each
26
+ return to_enum(__callee__) { @length } unless block_given?
27
+ each_node { |n| yield n.value }
28
+ end
29
+
30
+ def reverse_each
31
+ return to_enum(__callee__) { @length } unless block_given?
32
+ reverse_each_node { |n| yield n.value }
33
+ end
34
+
35
+ def each_node
36
+ return to_enum(__callee__) { @length } unless block_given?
37
+ node = @head
38
+ until node.nil?
39
+ node = (cur = node).next
40
+ yield cur
41
+ end
42
+ self
43
+ end
44
+
45
+ def reverse_each_node
46
+ return to_enum(__callee__) { @length } unless block_given?
47
+ node = @tail
48
+ until node.nil?
49
+ node = (cur = node).prev
50
+ yield cur
51
+ end
52
+ self
53
+ end
54
+
55
+ def <<(value)
56
+ insert nil, @head, value
57
+ end
58
+
59
+ def >>(value)
60
+ insert @tail, nil, value
61
+ end
62
+
63
+ def clear
64
+ each_node { |n| n.send :clear }
65
+ @head = @tail = nil
66
+ @length = 0
67
+ self
68
+ end
69
+
70
+ def delete(value)
71
+ last = each_node.reduce(NOMATCH) { |v, n| n.value == value ? n.delete : v }
72
+ return last unless last == NOMATCH
73
+ yield value if block_given?
74
+ end
75
+
76
+ def delete_if
77
+ return to_enum(__callee__) { @length } unless block_given?
78
+ each_node { |n| n.delete if yield n.value }
79
+ end
80
+
81
+ private
82
+
83
+ def insert(before, after, value)
84
+ node = Node.new(self, value)
85
+
86
+ unless before
87
+ @head = node
88
+ else
89
+ before.send :next=, node
90
+ node.send :prev=, before
91
+ end
92
+
93
+ unless after
94
+ @tail = node
95
+ else
96
+ after.send :prev=, node
97
+ node.send :next=, after
98
+ end
99
+
100
+ @length += 1
101
+ self
102
+ end
103
+
104
+ def remove(node)
105
+ before = node.prev
106
+ after = node.next
107
+
108
+ unless before
109
+ @head = after
110
+ else
111
+ before.send :next=, after
112
+ end
113
+
114
+ unless after
115
+ @tail = before
116
+ else
117
+ after.send :prev=, before
118
+ end
119
+
120
+ @length -= 1
121
+ self
122
+ end
123
+
124
+ class Node
125
+ attr_reader :list, :prev, :next
126
+ attr_accessor :value
127
+
128
+ def initialize(list, value)
129
+ @list = list
130
+ @value = value
131
+ end
132
+
133
+ def <(value)
134
+ list.send :insert, @prev, self, value
135
+ self
136
+ end
137
+
138
+ def >(value)
139
+ list.send :insert, self, @next, value
140
+ self
141
+ end
142
+
143
+ def delete
144
+ list.send :remove, self
145
+ clear
146
+ value
147
+ end
148
+
149
+ private
150
+
151
+ def prev=(node)
152
+ @prev = node
153
+ end
154
+
155
+ def next=(node)
156
+ @next = node
157
+ end
158
+
159
+ def clear
160
+ @list = @prev = @next = nil
161
+ end
162
+ end
163
+ end
164
+
165
+ end
@@ -0,0 +1,36 @@
1
+ require 'forwardable'
2
+
3
+ module Mores
4
+
5
+ class Succession
6
+ extend Forwardable
7
+
8
+ def line(name, &default)
9
+ singleton_class.delegate name => :'__list.head.value'
10
+ __list.tail.value.define_singleton_method name, default || proc { |*| }
11
+ end
12
+
13
+ def >>(value)
14
+ value.extend __forwarder
15
+ node = (__list.tail < value).prev
16
+ value.define_singleton_method(:__node) { node }
17
+ self
18
+ end
19
+
20
+ private
21
+
22
+ def __list
23
+ @__list ||= LinkedList.new >> Object.new
24
+ end
25
+
26
+ def __forwarder
27
+ @__forwarder ||= Module.new.module_exec(self) do |succession|
28
+ define_method(:method_missing) do |name, *args, &block|
29
+ return super(name, *args, &block) unless succession.singleton_methods.include? name
30
+ __node.next.value.public_send name, *args, &block
31
+ end
32
+ self; end
33
+ end
34
+ end
35
+
36
+ end
data/lib/mores/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Mores
2
- VERSION = '0.1.2'
2
+ VERSION = '0.1.3'
3
3
  end
data/lib/mores.rb CHANGED
@@ -1,2 +1,3 @@
1
1
  require 'mores/version'
2
- require 'mores/chainable'
2
+ require 'mores/linked_list'
3
+ require 'mores/succession'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mores
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Petter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-25 00:00:00.000000000 Z
11
+ date: 2016-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -77,7 +77,8 @@ files:
77
77
  - LICENSE.txt
78
78
  - README.md
79
79
  - lib/mores.rb
80
- - lib/mores/chainable.rb
80
+ - lib/mores/linked_list.rb
81
+ - lib/mores/succession.rb
81
82
  - lib/mores/version.rb
82
83
  - mores.gemspec
83
84
  homepage: http://github.com/michaeljpetter/mores
@@ -1,39 +0,0 @@
1
- module Mores
2
-
3
- module Chainable
4
- def self.included(mod)
5
- mod.extend ClassMethods
6
- end
7
-
8
- def **(chain)
9
- @__chain = chain
10
- self
11
- end
12
-
13
- private
14
-
15
- def __chain
16
- @__chain ||= self.class.__send__(:__default_chain).new
17
- end
18
-
19
- module ClassMethods
20
- def chain(name, &block)
21
- __forwarder.__send__(:define_method, name) do |*args|
22
- __chain.public_send(name, *args)
23
- end
24
- __default_chain.__send__(:define_method, name, block || proc { |*| })
25
- end
26
-
27
- private
28
-
29
- def __forwarder
30
- @__forwarder ||= superclass < Chainable ? superclass.__send__(:__forwarder) : Module.new.tap { |m| include m }
31
- end
32
-
33
- def __default_chain
34
- @__default_chain ||= Class.new(superclass < Chainable ? superclass.__send__(:__default_chain) : Object)
35
- end
36
- end
37
- end
38
-
39
- end