moory 1.0.0 → 1.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7f7daefff33b5cf15d86669bbaff8c8a8507d54259ac1b4199a8f173aef7bd38
4
- data.tar.gz: 2d3cf62ea14e5ef8d3164ff5bbeeb84f415c806bdf7f1da63990a1fa53da4553
3
+ metadata.gz: f9bd19c3c77df5dc2dcd9704047df98db0ac75b1e9e0c6786b21aca476bb02cd
4
+ data.tar.gz: bce8c57e2ff2743d6dc2259489f73c5cef5806fadf95175587b90350a1cb2cc2
5
5
  SHA512:
6
- metadata.gz: d7b95ea00e217342548717c61b75909c63e610110a2597f1d0b78c78b25c171d893d9a9b743799a206a78cdeb748df25d1f636892e59fe570d62040de7695928
7
- data.tar.gz: c54777928180b9365eabef5ef140b75d67cbd5401483a046862b31a339f588a90a9894e6cdcbf4af5d8364b9dea9455fa18b929303ae2ed3727835166c6470cb
6
+ metadata.gz: e7c9f878405512b333da0ab4bbd1cc4a102cbe4ad737e7ca85bb6479c3486dc80bcc9d2d9cef27a36b009fe34c62f1554343e00cdce331faf3625ec0c2cc9b91
7
+ data.tar.gz: 3712aae9d6adef08d7e1a8ab82fc23dc293a884609558e34996bc3d257ccd95ec4f11e6423eef269a5d5ab3596f5768eccadcb1cce5025ce9c23941045663333
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- moory (1.0.0)
4
+ moory (1.1.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -0,0 +1,29 @@
1
+ require 'moory'
2
+
3
+ balanced_parens_config = {
4
+ basis: 'basis',
5
+ specs: {
6
+ 'basis' => {
7
+ initial: 'ε',
8
+ rules: """
9
+ ε : ( / parenthetical / defer : δ
10
+ """,
11
+ },
12
+ 'parenthetical' => {
13
+ initial: 'ε',
14
+ rules: """
15
+ ε : ( / parenthetical / defer : δ
16
+ ε : ) // reconvene : ω
17
+ δ : ) // reconvene : ω
18
+ """
19
+ }
20
+ }
21
+ }
22
+
23
+ logistic = Moory::Logistic::Controller.new(balanced_parens_config)
24
+
25
+ "(()".each_char do |c|
26
+ logistic.issue(c)
27
+ end
28
+
29
+ pp logistic.done?
@@ -9,6 +9,7 @@ require "moory/ruleparser"
9
9
  require "moory/loader"
10
10
  require "moory/recogniser"
11
11
  require "moory/decoder"
12
+ require "moory/logistic"
12
13
 
13
14
  module Moory
14
15
  # Your code goes here...
@@ -0,0 +1,103 @@
1
+ module Moory
2
+ module Logistic
3
+ class Unit
4
+ include Moory::Efferent
5
+
6
+ def initialize(rules:, initial:)
7
+ @initial = initial
8
+ configure(rules)
9
+ end
10
+
11
+ def issue(stimulus)
12
+ understand?(stimulus) ?
13
+ super :
14
+ (raise "Unexpected #{stimulus}")
15
+ end
16
+
17
+ def prime
18
+ @state = @initial
19
+ end
20
+
21
+ private
22
+
23
+ def configure(rules)
24
+ Moory::Loader.load(rules:rules, machine:self)
25
+ prime
26
+ end
27
+ end
28
+
29
+ class Controller
30
+ def initialize(config)
31
+ @config = config
32
+ prepare_units
33
+ end
34
+
35
+ def prepare_units
36
+ create_units
37
+ wire_units
38
+ focus_on(@config[:basis])
39
+ end
40
+
41
+ def units
42
+ @units ||= {}
43
+ end
44
+
45
+ def active_unit
46
+ units[@focus]
47
+ end
48
+
49
+ def deferrals
50
+ @deferrals ||= []
51
+ end
52
+
53
+ def issue(stimulus)
54
+ active_unit.issue(stimulus)
55
+ end
56
+
57
+ def done?
58
+ deferrals.empty?
59
+ end
60
+
61
+ private
62
+
63
+ def create_units
64
+ @config[:specs].each do |name, spec|
65
+ units.store(name, Unit.new(spec))
66
+ end
67
+ end
68
+
69
+ def wire_units
70
+ units.values.each do |v|
71
+ v.repertoire.cram({
72
+ 'defer' => method(:defer),
73
+ 'reconvene' => method(:reconvene),
74
+ })
75
+ end
76
+ end
77
+
78
+ def focus_on(unit_name)
79
+ @focus = unit_name
80
+ end
81
+
82
+ def defer(unit_name)
83
+ deferrals.push(
84
+ {
85
+ name: @focus.clone,
86
+ state: units[@focus].state.clone
87
+ }
88
+ )
89
+ focus_on(unit_name)
90
+ active_unit.prime
91
+ end
92
+
93
+ def reconvene
94
+ raise "Cannot reconvene without prior deferral" if deferrals.empty?
95
+
96
+ deferrals.pop.tap do |last_deferral|
97
+ focus_on(last_deferral[:name])
98
+ active_unit.state = last_deferral[:state]
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -62,8 +62,8 @@ module Moory
62
62
  private
63
63
 
64
64
  def honour(response)
65
- perform(response) if repertoire
66
65
  super
66
+ perform(response) if repertoire
67
67
  end
68
68
 
69
69
  def perform(response)
@@ -1,3 +1,3 @@
1
1
  module Moory
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moory
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam W. Grant
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-07-23 00:00:00.000000000 Z
11
+ date: 2018-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -71,9 +71,11 @@ files:
71
71
  - bin/setup
72
72
  - examples/ab_star.rb
73
73
  - examples/decoder.rb
74
+ - examples/inductive.rb
74
75
  - lib/moory.rb
75
76
  - lib/moory/decoder.rb
76
77
  - lib/moory/loader.rb
78
+ - lib/moory/logistic.rb
77
79
  - lib/moory/machine.rb
78
80
  - lib/moory/pair.rb
79
81
  - lib/moory/recogniser.rb