trither 0.5.0 → 0.6.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
  SHA1:
3
- metadata.gz: 9279f7b994e89ec63bc8e681fb28effea01466dc
4
- data.tar.gz: e100b0379b2dc1b9b4cbc29d0f651cd2d41e3df8
3
+ metadata.gz: 41180ec809ba98b117705827cace6e55a5a3ae39
4
+ data.tar.gz: 183b0d8e6939c387a882e34b8b6c16cd48ded687
5
5
  SHA512:
6
- metadata.gz: a9aaa1d0f041bbc8a15d8201738750f468cf7adfc13feca82a2d4c54019228fe09efacbf7b8de5b9e4789616c1193dbe49c356bfe3c33e86fe07f4e02d29f367
7
- data.tar.gz: c6675405ddeef783c8b93b73504d3c434695107f320b8d726eef5202468c42fef8242b387657e2fe2e2cda10d7ac6284a71c8c1412054f8eb4cf6c2b0f8d98e0
6
+ metadata.gz: 85b7714989e60cdc50eea1ad3db219f607f2cd4f71aa5771a632996a7a4b344ced5e864c021798fd86b2af6b7ba648e31ea41a3ec95e7d3f19d745dd9e642a81
7
+ data.tar.gz: 74854dc880e1087e77fa419ced4b4810b856b21f581547b7f81031dd713fc28d711e6ce7596603d05fc88bdf460617ff792954baeb152a5880d242774a3913ea
@@ -1,16 +1,30 @@
1
1
  require 'trither/version'
2
+ require 'contracts'
2
3
 
3
4
  module Trither
4
5
  class Box
6
+ include Contracts::Core
7
+ C = Contracts
8
+
9
+ Contract C::Any => C::Any
5
10
  def initialize(value)
6
11
  @value = value
7
12
  end
8
13
 
14
+ Contract C::Any => C::Bool
9
15
  def ==(other)
10
16
  (self.class == other.class) &&
11
17
  (@value == other.instance_variable_get('@value'))
12
18
  end
13
19
  end
20
+
21
+ module BasicTypes
22
+ include Contracts::Core
23
+ C = Contracts
24
+ Predicate = C::Func[C::Any => C::Bool]
25
+ Func0 = C::Func[C::None => C::Any]
26
+ Func1 = C::Func[C::Any => C::Any]
27
+ end
14
28
  end
15
29
 
16
30
  require 'trither/try'
@@ -1,45 +1,92 @@
1
+ require 'contracts'
2
+
1
3
  module Either
4
+ include ::Trither::BasicTypes
5
+
2
6
  class Left < Trither::Box
7
+ end
8
+
9
+ class Right < Trither::Box
10
+ end
11
+
12
+ EitherType = C::Or[Left, Right]
13
+ Func1toEither = C::Func[C::Any => EitherType]
14
+
15
+ class Left < Trither::Box
16
+ include ::Trither::BasicTypes
17
+
18
+ Contract C::None => true
3
19
  def left?
4
20
  true
5
21
  end
6
22
 
23
+ Contract C::None => false
7
24
  def right?
8
25
  false
9
26
  end
10
27
 
28
+ Contract C::None => C::Any
11
29
  def left
12
30
  @value
13
31
  end
14
32
 
33
+ Contract Func1 => Left
15
34
  def left_map
16
35
  Left.new(yield @value)
17
36
  end
18
37
 
38
+ Contract Func1 => Left
19
39
  def right_map
20
40
  self
21
41
  end
42
+
43
+ Contract Func1toEither => EitherType
44
+ def left_flat_map
45
+ yield @value
46
+ end
47
+
48
+ Contract Func1toEither => Left
49
+ def right_flat_map
50
+ self
51
+ end
22
52
  end
23
53
 
24
54
  class Right < Trither::Box
55
+ include ::Trither::BasicTypes
56
+
57
+ Contract C::None => false
25
58
  def left?
26
59
  false
27
60
  end
28
61
 
62
+ Contract C::None => true
29
63
  def right?
30
64
  true
31
65
  end
32
66
 
67
+ Contract C::None => C::Any
33
68
  def right
34
69
  @value
35
70
  end
36
71
 
72
+ Contract Func1 => Right
37
73
  def left_map
38
74
  self
39
75
  end
40
76
 
77
+ Contract Func1 => Right
41
78
  def right_map
42
79
  Right.new(yield @value)
43
80
  end
81
+
82
+ Contract Func1toEither => Right
83
+ def left_flat_map
84
+ self
85
+ end
86
+
87
+ Contract Func1toEither => EitherType
88
+ def right_flat_map
89
+ yield @value
90
+ end
44
91
  end
45
92
  end
@@ -1,4 +1,20 @@
1
+ require 'contracts'
2
+
1
3
  module Option
4
+ include Contracts::Core
5
+ C = Contracts
6
+
7
+ module None
8
+ end
9
+
10
+ class Some < Trither::Box
11
+ end
12
+
13
+ NoneType = ->(x) { x == None }
14
+ OptionType = C::Or[NoneType, Some]
15
+ Func1toOption = C::Func[C::Any => OptionType]
16
+
17
+ Contract C::Any => C::Or[->(x) { x == None }, Some]
2
18
  def self.make(value)
3
19
  if value.nil?
4
20
  None
@@ -7,53 +23,90 @@ module Option
7
23
  end
8
24
  end
9
25
 
26
+ Contract C::ArrayOf[OptionType] => OptionType
27
+ def self.all(array_of_options)
28
+ array_of_options.reduce(Some.new([])) do |memo, option|
29
+ memo.flat_map do |array|
30
+ option.map { |value| array + [value] }
31
+ end
32
+ end
33
+ end
34
+
35
+ Contract C::ArrayOf[OptionType] => C::ArrayOf[C::Any]
36
+ def self.flatten(array_of_options)
37
+ array_of_options.reduce([]) do |array, option|
38
+ if option.empty?
39
+ array
40
+ else
41
+ array + [option.get_or_else { raise StandardError }]
42
+ end
43
+ end
44
+ end
45
+
10
46
  module None
47
+ include Contracts::Core
48
+ include ::Trither::BasicTypes
49
+
50
+ Contract C::None => true
11
51
  def self.empty?
12
52
  true
13
53
  end
14
54
 
55
+ Contract Predicate => NoneType
15
56
  def self.filter
16
57
  self
17
58
  end
18
59
 
60
+ Contract C::Any => C::Any
19
61
  def self.fetch(default)
20
62
  default
21
63
  end
22
64
 
65
+ Contract Func1 => NoneType
23
66
  def self.map
24
67
  self
25
68
  end
26
69
 
70
+ Contract Func1toOption => OptionType
27
71
  def self.flat_map
28
72
  self
29
73
  end
30
74
 
75
+ Contract Func1toOption => OptionType
31
76
  def self.or_else
32
77
  yield
33
78
  end
34
79
 
80
+ Contract Func0 => C::Any
35
81
  def self.get_or_else
36
82
  yield
37
83
  end
38
84
  end
39
85
 
40
- class Some < Trither::Box
86
+ class Some
87
+ include ::Trither::BasicTypes
88
+
89
+ Contract C::None => false
41
90
  def empty?
42
91
  false
43
92
  end
44
93
 
94
+ Contract Predicate => OptionType
45
95
  def filter
46
96
  yield(@value) ? self : None
47
97
  end
48
98
 
99
+ Contract C::Any => C::Any
49
100
  def fetch(_default)
50
101
  @value
51
102
  end
52
103
 
104
+ Contract Func1 => OptionType
53
105
  def map
54
106
  Option.make(yield @value)
55
107
  end
56
108
 
109
+ Contract Func1toOption => OptionType
57
110
  def flat_map
58
111
  result = yield @value
59
112
  if result.nil?
@@ -63,10 +116,12 @@ module Option
63
116
  end
64
117
  end
65
118
 
119
+ Contract Func1toOption => Some
66
120
  def or_else
67
121
  self
68
122
  end
69
123
 
124
+ Contract Func0 => C::Any
70
125
  def get_or_else
71
126
  @value
72
127
  end
@@ -1,4 +1,20 @@
1
+ require 'contracts'
2
+
1
3
  module Try
4
+ include Contracts::Core
5
+ include ::Trither::BasicTypes
6
+
7
+ class Failure < Trither::Box
8
+ end
9
+
10
+ class Success < Trither::Box
11
+ end
12
+
13
+ TryType = C::Or[Failure, Success]
14
+ Func0toTry = C::Func[C::None => TryType]
15
+ Func1toTry = C::Func[C::Any => TryType]
16
+
17
+ Contract Func1 => TryType
2
18
  def self.make
3
19
  Success.new(yield)
4
20
  rescue StandardError => error
@@ -6,60 +22,78 @@ module Try
6
22
  end
7
23
 
8
24
  class Failure < Trither::Box
25
+ include ::Trither::BasicTypes
26
+
27
+ Contract C::None => true
9
28
  def failure?
10
29
  true
11
30
  end
12
31
 
32
+ Contract Predicate => Failure
13
33
  def filter
14
34
  self
15
35
  end
16
36
 
37
+ Contract Func1toTry => Failure
17
38
  def flat_map
18
39
  self
19
40
  end
20
41
 
42
+ Contract Func1 => Failure
21
43
  def map
22
44
  self
23
45
  end
24
46
 
47
+ Contract Func1 => Failure
25
48
  def fail_map
26
49
  Failure.new yield(@value)
27
50
  end
28
51
 
52
+ Contract Func0toTry => TryType
29
53
  def or_else
30
54
  yield @value
31
55
  end
32
56
 
57
+ Contract Func0 => C::Any
33
58
  def get_or_else
34
59
  yield @value
35
60
  end
36
61
  end
37
62
 
38
63
  class Success < Trither::Box
64
+ include ::Trither::BasicTypes
65
+
66
+ Contract C::None => false
39
67
  def failure?
40
68
  false
41
69
  end
42
70
 
71
+ Contract Predicate => TryType
43
72
  def filter
44
73
  yield(@value) ? self : Failure.new(Option::None)
45
74
  end
46
75
 
76
+ Contract Func1toTry => TryType
47
77
  def flat_map
48
78
  yield @value
49
79
  end
50
80
 
81
+ Contract Func1 => TryType
51
82
  def map
52
83
  Success.new yield(@value)
53
84
  end
54
85
 
86
+ Contract Func1 => TryType
55
87
  def fail_map
56
88
  self
57
89
  end
58
90
 
91
+ Contract Func0toTry => TryType
59
92
  def or_else
60
93
  self
61
94
  end
62
95
 
96
+ Contract Func0 => C::Any
63
97
  def get_or_else
64
98
  @value
65
99
  end
@@ -1,3 +1,3 @@
1
1
  module Trither
2
- VERSION = '0.5.0'.freeze
2
+ VERSION = '0.6.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,57 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trither
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lyall Jonathan Di Trapani
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-04 00:00:00.000000000 Z
11
+ date: 2017-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: contracts
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.14'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.14'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - "~>"
18
32
  - !ruby/object:Gem::Version
19
- version: '1.11'
33
+ version: '1.13'
20
34
  type: :development
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
- version: '1.11'
40
+ version: '1.13'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '10.0'
47
+ version: '12.0'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '10.0'
54
+ version: '12.0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rspec
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '3.0'
61
+ version: '3.5'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '3.0'
68
+ version: '3.5'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rubocop
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -98,7 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
98
112
  version: '0'
99
113
  requirements: []
100
114
  rubyforge_project:
101
- rubygems_version: 2.2.2
115
+ rubygems_version: 2.6.8
102
116
  signing_key:
103
117
  specification_version: 4
104
118
  summary: Simple implementations of Try, Either, and Option