t_algebra 0.1.3 → 0.1.4

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: 6221dd03765274df626f469be73419363b05e6477d272b08ec52b1d84a2a4b53
4
- data.tar.gz: de23c69aaba2ef29785c30e329b99b164c185664435da5d80ae0c6c45db2701b
3
+ metadata.gz: 73caa97534e32367521cfb546ff88fd128c784e24a64502e6ef718d843782db8
4
+ data.tar.gz: 58af8ae70b758560b338d4591c18a15a670dadbcbba6097afa4e7c055e3c20ce
5
5
  SHA512:
6
- metadata.gz: 731382f98a5589bd8eae51bbc590eba8a4b08abe3fce0b4f28a39186884fa24c34c39547360c8babe1c81bf5b8357827dc7dbcaa1ffe0b27e6a6e21ed1c80aa2
7
- data.tar.gz: b48960e069fbac98a2da345bf29fd6f8df55f160c7d25fad674e2918522ff8c5024c366ab9d08d85eea144ed8af7ea070e25857ba5543b1f3c0b0751639bf791
6
+ metadata.gz: 1187a260b07ab04d8355ea9a777d4d26b7c727170ea6588bb0c1e88b64e7468e231f9af9090d935f5a40beb51bd45efe4abda878349655ec879ea11d2c06c40e
7
+ data.tar.gz: 995fbbc1994d8fb7a6b8d6825f3862ba3b821ed386f015e7c0c3574d5bfe3619c99c21aaaa30ad2c89b911e0594259ca27889525680db61627efc4ba756ccf46
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- t_algebra (0.1.2)
4
+ t_algebra (0.1.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -17,14 +17,16 @@ module TAlgebra
17
17
  end
18
18
  end
19
19
 
20
- def fmap(&block)
21
- return dup if left? || !block
20
+ def fmap
21
+ raise UseError.new("#fmap requires a block") unless block_given?
22
+ return dup if left?
22
23
 
23
24
  self.class.pure(yield(value))
24
25
  end
25
26
 
26
27
  def bind(&block)
27
- return dup if left? || !block
28
+ raise UseError.new("#bind requires a block") unless block
29
+ return dup if left?
28
30
 
29
31
  self.class.instance_exec(value, &block)
30
32
  end
@@ -37,7 +39,12 @@ module TAlgebra
37
39
  is == RIGHT
38
40
  end
39
41
 
42
+ def from_either!
43
+ from_either { |e| raise UnsafeError.new("#from_either! exception. #{e}") }
44
+ end
45
+
40
46
  def from_either
47
+ raise UseError.new("#from_either called without block") unless block_given?
41
48
  return yield(value) if left?
42
49
  value
43
50
  end
@@ -0,0 +1,9 @@
1
+ module TAlgebra
2
+ module Monad
3
+ class UseError < StandardError
4
+ end
5
+
6
+ class UnsafeError < StandardError
7
+ end
8
+ end
9
+ end
@@ -19,6 +19,12 @@ module TAlgebra
19
19
  def to_maybe(value_or_nil)
20
20
  value_or_nil.nil? ? nothing : pure(value_or_nil)
21
21
  end
22
+
23
+ # def run_bind(ma, &block)
24
+ # # raise "Yield blocks must return instances of #{self}. Got #{ma.class}" unless [Parser, Parser::Optional].include?(ma.class)
25
+ #
26
+ # ma.bind(&block)
27
+ # end
22
28
  end
23
29
 
24
30
  def fmap(&block)
@@ -39,11 +45,24 @@ module TAlgebra
39
45
  is == JUST
40
46
  end
41
47
 
48
+ def from_maybe!
49
+ from_maybe { |e| raise UnsafeError.new("#from_maybe! exception. #{e}") }
50
+ end
51
+
42
52
  def from_maybe
53
+ raise UseError.new("#from_maybe called without block") unless block_given?
43
54
  return yield if nothing?
44
55
  value
45
56
  end
46
57
 
58
+ def fetch(key)
59
+ bind do |o|
60
+ self.class.to_maybe(
61
+ o.respond_to?(:[]) ? o[key] : o.send(key)
62
+ )
63
+ end
64
+ end
65
+
47
66
  def ==(other)
48
67
  to_obj == other.to_obj
49
68
  end
@@ -10,21 +10,19 @@ module TAlgebra
10
10
 
11
11
  class << self
12
12
  def failure(msg, name = nil)
13
- left(msg).with_name(name)
13
+ new(is: Either::LEFT, value: msg, name: name)
14
14
  end
15
15
 
16
16
  def parse(val, name = nil)
17
- right(val).with_name(name)
17
+ new(is: Either::RIGHT, value: val, name: name)
18
18
  end
19
19
 
20
20
  def fetch(o, key)
21
- parser = parse(o.respond_to?(:[]) ? o[key] : o.send(key))
22
- parser.with_name(key).optional
21
+ parse(o).fetch(key)
23
22
  end
24
23
 
25
24
  def fetch!(o, key)
26
- parser = parse(o.respond_to?(:[]) ? o[key] : o.send(key))
27
- parser.with_name(key).required
25
+ parse(o).fetch!(key)
28
26
  end
29
27
 
30
28
  def run_bind(ma, &block)
@@ -34,21 +32,21 @@ module TAlgebra
34
32
  end
35
33
  end
36
34
 
35
+ alias_method :valid?, :right?
36
+ alias_method :failure?, :left?
37
+
37
38
  attr_reader :name
38
39
  def with_name(name)
39
40
  @name = name
40
41
  self
41
42
  end
42
43
 
43
- alias_method :valid?, :right?
44
- alias_method :failure?, :left?
45
-
46
44
  def fetch(key)
47
- fmap { |o| o.respond_to?(:[]) ? o[key] : o.send(key) }.optional
45
+ with_name(key).fmap { |o| o.respond_to?(:[]) ? o[key] : o.send(key) }.optional
48
46
  end
49
47
 
50
48
  def fetch!(key)
51
- fmap { |o| o.respond_to?(:[]) ? o[key] : o.send(key) }.required
49
+ with_name(key).fmap { |o| o.respond_to?(:[]) ? o[key] : o.send(key) }.required
52
50
  end
53
51
 
54
52
  def fmap
@@ -79,6 +77,10 @@ module TAlgebra
79
77
  from_either(&block)
80
78
  end
81
79
 
80
+ def extract_parsed!
81
+ extract_parsed { |e| raise UnsafeError.new("#extract_parsed! exception. #{e}") }
82
+ end
83
+
82
84
  def required
83
85
  validate("Is required") { |v| !v.nil? }
84
86
  end
@@ -21,9 +21,9 @@ module TAlgebra
21
21
  run_recursive(e, [])
22
22
  end
23
23
 
24
- def run_bind(ma)
24
+ def run_bind(ma, &block)
25
25
  raise "Yield blocks must return instances of #{self}" unless ma.instance_of?(self)
26
- ma.bind
26
+ ma.bind(&block)
27
27
  end
28
28
 
29
29
  def lift_a2(ma, mb, &block)
@@ -45,7 +45,8 @@ module TAlgebra
45
45
  end
46
46
 
47
47
  if is_complete(enum)
48
- pure(value(enum))
48
+ val = value(enum)
49
+ val.is_a?(self.class) ? val : pure(val)
49
50
  else
50
51
  run_bind(enum.next.call) do |a|
51
52
  run_recursive(enum, historical_values + [a])
@@ -1,3 +1,3 @@
1
1
  module TAlgebra
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
data/lib/t_algebra.rb CHANGED
@@ -2,6 +2,7 @@ require_relative "t_algebra/version"
2
2
  require_relative "t_algebra/functor"
3
3
  require_relative "t_algebra/applicative"
4
4
  require_relative "t_algebra/monad"
5
+ require_relative "t_algebra/monad/errors"
5
6
  require_relative "t_algebra/monad/maybe"
6
7
  require_relative "t_algebra/monad/either"
7
8
  require_relative "t_algebra/monad/list"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: t_algebra
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - aaron
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-12-06 00:00:00.000000000 Z
11
+ date: 2021-12-07 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -33,6 +33,7 @@ files:
33
33
  - lib/t_algebra/functor.rb
34
34
  - lib/t_algebra/monad.rb
35
35
  - lib/t_algebra/monad/either.rb
36
+ - lib/t_algebra/monad/errors.rb
36
37
  - lib/t_algebra/monad/list.rb
37
38
  - lib/t_algebra/monad/maybe.rb
38
39
  - lib/t_algebra/monad/parser.rb