@@ -36,11 +36,59 @@ def is_err_and(&block)
3636 end
3737
3838 def ok
39- is_ok ? Some [ @value_type ] { @value } : None [ @value_type ]
39+ if is_ok
40+ Some [ @value_type ] { @value }
41+ else
42+ None [ @value_type ]
43+ end
4044 end
4145
4246 def err
43- is_err ? Some [ @error_type ] { @error } : None [ @error_type ]
47+ if is_err
48+ Some [ @error_type ] { @error }
49+ else
50+ None [ @error_type ]
51+ end
52+ end
53+
54+ def map ( value_type , &block )
55+ if is_ok
56+ Ok [ value_type , @error_type ] { block . call ( @value ) }
57+ else
58+ Err [ value_type , @error_type ] { @error }
59+ end
60+ end
61+
62+ def map_or ( default , &block )
63+ is_ok ? block . call ( @value ) : default
64+ end
65+
66+ def map_or_else ( default , &block )
67+ is_ok ? block . call ( @value ) : default . call ( @error )
68+ end
69+
70+ def map_err ( error_type , &block )
71+ if is_ok
72+ Ok [ @value_type , error_type ] { @value }
73+ else
74+ Err [ @value_type , error_type ] { block . call ( @error ) }
75+ end
76+ end
77+
78+ def tap ( &block )
79+ if is_ok
80+ value = @value
81+ block . call ( value )
82+ end
83+ self
84+ end
85+
86+ def tap_err ( &block )
87+ if is_err
88+ error = @error
89+ block . call ( error )
90+ end
91+ self
4492 end
4593
4694 def expect ( msg )
@@ -51,6 +99,46 @@ def unwrap
5199 is_ok ? @value : raise ( UnwrapOnErr . new ( "called unwrap on an Err value: #{ @error } " ) )
52100 end
53101
102+ def expect_err ( msg )
103+ is_ok ? raise ( UnwrapErrOnOk . new ( "#{ msg } : #{ @value } " ) ) : @error
104+ end
105+
106+ def unwrap_err
107+ is_ok ? raise ( UnwrapErrOnOk . new ( "called unwrap_err() on an Ok value: #{ @value } " ) ) : @error
108+ end
109+
110+ def and ( other )
111+ if is_ok
112+ other
113+ else
114+ Err [ other . value_type , @error_type ] { @error }
115+ end
116+ end
117+
118+ def and_then ( value_type , &block )
119+ if is_ok
120+ block . call ( @value )
121+ else
122+ Err [ value_type , @error_type ] { @error }
123+ end
124+ end
125+
126+ def or ( other )
127+ if is_ok
128+ Ok [ @value_type , other . error_type ] { @value }
129+ else
130+ other
131+ end
132+ end
133+
134+ def or_else ( error_type , &block )
135+ if is_ok
136+ Ok [ @value_type , error_type ] { @value }
137+ else
138+ block . call ( @error )
139+ end
140+ end
141+
54142 def unwrap_or ( default )
55143 is_ok ? @value : default
56144 end
@@ -59,12 +147,24 @@ def unwrap_or_else(&block)
59147 is_ok ? @value : block . call ( @error )
60148 end
61149
62- def expect_err ( msg )
63- is_ok ? raise ( UnwrapErrOnOk . new ( " #{ msg } : #{ @value } " ) ) : @error
150+ def self . from_or ( value_type , error , & block )
151+ Ok [ value_type , error . class ] { block . call }
64152 end
65153
66- def unwrap_err
67- is_ok ? raise ( UnwrapErrOnOk . new ( "called unwrap_err() on an Ok value: #{ @value } " ) ) : @error
154+ def self . from_or? ( value_type , error , &block )
155+ value = block . call
156+ if value == nil
157+ Err [ value_type , error . class ] { error }
158+ else
159+ Ok [ value_type , error . class ] { value }
160+ end
161+ end
162+
163+ def self . from_or! ( value_type , error , &block )
164+ value = block . call
165+ Ok [ value_type , error . class ] { value }
166+ rescue StandardError
167+ Err [ value_type , error . class ] { error }
68168 end
69169 end
70170end
0 commit comments