hitsuji 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/hitsuji.rb +6 -6
  3. data/lib/subsystem.rb +23 -6
  4. metadata +17 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b084cd337a2aa754de2f5f8b0448964e30e1d352b7a59b7172f5817f89a7caf1
4
- data.tar.gz: e8498e02136c8b754d37c96826bd84bb8f96da8fa7e17005f1af2eed34bbd66a
3
+ metadata.gz: 7c41db3b6e6ca1cb18ae1e6dcb161739641e43465f600be7d0be4bcc47cbc522
4
+ data.tar.gz: fd6960c1f691d2f24abd5b86cdef3bb0dcb180ad652229e0112a77a1554b9967
5
5
  SHA512:
6
- metadata.gz: ce02e589408a6d7845a15d8aa11f231ed9d14056d369dd39dbbbc95286c393e73a1d3b218560e764edfe21b4d5d327b4040a1f36e71734fcca13c83082628e36
7
- data.tar.gz: '09061782dc349c041754b64ed05d1cfaf2fad6badbcc34a9f2befcfa5c1cf13997cd3d39a6a0c74c54f42e1589d822142f5f04c15395c2d9d8cc0e2f0e737d53'
6
+ metadata.gz: 88ea5f30e92347db4cd6912f249960d086e52fee378144b4e0b4d32a13197fec5b0fff60be7ebf09c9904dd0092476a472a696e7a8e297f9d8d6786385767f2b
7
+ data.tar.gz: 89491e5e7bbab1141192426e4d0ac3c200bca58d134dc63a109a48b713bd616da8f4c4298198daef993400a8a3f4e99e895e14d93e7a983f567427026f5b1a9f
@@ -6,7 +6,7 @@ require_relative 'control.rb'
6
6
  # all the functions you need. Examples using this class can be found in the
7
7
  # descriptions of the class and instance methods below.
8
8
  class Hitsuji
9
- # Creates a new system where all operations are performed.
9
+ # Creates a new empty system.
10
10
  #
11
11
  # ==== Example
12
12
  #
@@ -65,7 +65,7 @@ class Hitsuji
65
65
  # * +name+ - the name of the new linker, which is written as a symbol.
66
66
  # * +input+ - the contents of the new linker, whether that be an item or
67
67
  # another linker.
68
- # * +block+ - a block as a string to perform the operation
68
+ # * +block+ - a block that performs the operation
69
69
  #
70
70
  # ==== Example
71
71
  #
@@ -74,10 +74,10 @@ class Hitsuji
74
74
  # my_item2 = Hitsuji.item(:qux, 2) # a second item
75
75
  # items = [:foo, :qux]
76
76
  # my_linker = Hitsuji.linker(:baz, items) # a new linker
77
- # my_op = Hitsuji.operation(:op, my_linker, %{
77
+ # my_op = Hitsuji.operation(:op, my_linker) {
78
78
  # |arg1, arg2| arg1 + arg2
79
- # }) # => :foo + :qux => 1 + 2 => 3 # a new operation
80
- def self.operation(name, input, block)
79
+ # } # => :foo + :qux => 1 + 2 => 3 # a new operation
80
+ def self.operation(name, input, &block)
81
81
  Operation.new(name, input, block)
82
82
  end
83
83
 
@@ -90,7 +90,7 @@ class Hitsuji
90
90
  #
91
91
  # ==== Attributes
92
92
  #
93
- # * +obj+ - the items, linkers and operation you want to bind
93
+ # * +obj+ - the items, linkers and operations you want to bind
94
94
  #
95
95
  # ==== Example
96
96
  #
@@ -1,3 +1,5 @@
1
+ require 'method_source'
2
+
1
3
  # The Item class is the Hitsuji representation of a variable, and its properties
2
4
  # include a name and a value. The value has read-write properties, but once the
3
5
  # Item is bound, a seperate method must be used to read and change it. Examples
@@ -29,18 +31,33 @@ end
29
31
  # The Operation class is the Hitsuji representation of an equation, and its
30
32
  # properties include a name, a value and a block. The value is an Linker with
31
33
  # read-write properties, and the values in this Linker are parsed into the block
32
- # for execution. This block is not presented as block however, but as a string,
33
- # only executed upon read of dependent values. Once the Operation is bound, a
34
- # seperate method must be used to read them. Linkers are the main interface
35
- # between Items and Operations. Examples of its use can be seen in the
36
- # documentation for the Hitsuji.operation method.
34
+ # for execution. This block is only executed upon read of dependent values. Once
35
+ # the Operation is bound, a seperate method must be used to read them. Linkers
36
+ # are the main interface between Items and Operations. Examples of its use can
37
+ # be seen in the documentation for the Hitsuji.operation method.
37
38
  class Operation
38
39
  def initialize(name, input, block)
39
40
  @name = name
40
41
  @input = input
41
- @block = block
42
+ src = MethodSource.source_helper(block.source_location)
43
+ @block = 'proc ' + src.match(/(do|\{)+?(.|\s)*(end|\})+?/).to_s
44
+ end
45
+
46
+ def call
47
+ eval(@block).call(recurse(@input.value))
48
+ end
49
+
50
+ def recurse(obj)
51
+ res = []
52
+ obj.each do |n|
53
+ res << n.value if n.class == Item
54
+ res << n.call_proc if n.class == Operation
55
+ res << recurse(n.value) if n.class == Linker
56
+ end
57
+ res
42
58
  end
43
59
 
60
+ private :recurse
44
61
  attr_reader :block
45
62
  attr_accessor :name, :input
46
63
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hitsuji
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Quail
@@ -9,7 +9,21 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2019-02-07 00:00:00.000000000 Z
12
- dependencies: []
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: method_source
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.9.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.9.2
13
27
  description: |-
14
28
  Hitsuji is a library that implements a tree data structure,
15
29
  where each node is represented by a value, points to other values, or performs
@@ -34,7 +48,7 @@ licenses:
34
48
  metadata:
35
49
  source_code_uri: https://github.com/realtable/hitsuji
36
50
  bug_tracker_uri: https://github.com/realtable/hitsuji/issues
37
- documentation_uri: https://www.rubydoc.info/gems/hitsuji/0.2.2
51
+ documentation_uri: https://www.rubydoc.info/gems/hitsuji/0.3.0
38
52
  post_install_message:
39
53
  rdoc_options: []
40
54
  require_paths: