@@ -6,6 +6,9 @@ class Context < self
66 require_relative 'context/success'
77 require_relative 'context/mixin'
88 require_relative 'context/expectations'
9+ require_relative 'context/callable_and_then'
10+
11+ EXPECTED_OUTCOME = 'BCDD::Result::Context::Success or BCDD::Result::Context::Failure'
912
1013 def self . Success ( type , **value )
1114 Success . new ( type : type , value : value )
@@ -27,6 +30,14 @@ def and_then(method_name = nil, **injected_value, &block)
2730 super ( method_name , injected_value , &block )
2831 end
2932
33+ def and_then! ( source , **injected_value )
34+ _call = injected_value . delete ( :_call )
35+
36+ acc . merge! ( injected_value )
37+
38+ super ( source , injected_value , _call : _call )
39+ end
40+
3041 protected
3142
3243 attr_reader :acc
@@ -35,7 +46,10 @@ def and_then(method_name = nil, **injected_value, &block)
3546
3647 SourceMethodArity = -> ( method ) do
3748 return 0 if method . arity . zero?
38- return 1 if method . parameters . map ( &:first ) . all? ( /\A key/ )
49+
50+ parameters = method . parameters . map ( &:first )
51+
52+ return 1 if !parameters . empty? && parameters . all? ( /\A key/ )
3953
4054 -1
4155 end
@@ -56,6 +70,12 @@ def call_and_then_block!(block)
5670 block . call ( acc )
5771 end
5872
73+ def call_and_then_callable! ( source , value :, injected_value :, method_name :)
74+ acc . merge! ( value . merge ( injected_value ) )
75+
76+ CallableAndThen ::Caller . call ( source , value : acc , injected_value : injected_value , method_name : method_name )
77+ end
78+
5979 def ensure_result_object ( result , origin :)
6080 raise_unexpected_outcome_error ( result , origin ) unless result . is_a? ( Context )
6181
@@ -64,12 +84,10 @@ def ensure_result_object(result, origin:)
6484 raise Error ::InvalidResultSource . build ( given_result : result , expected_source : source )
6585 end
6686
67- EXPECTED_OUTCOME = 'BCDD::Result::Context::Success or BCDD::Result::Context::Failure'
68-
6987 def raise_unexpected_outcome_error ( result , origin )
7088 raise Error ::UnexpectedOutcome . build ( outcome : result , origin : origin , expected : EXPECTED_OUTCOME )
7189 end
7290
73- private_constant :SourceMethodArity , :EXPECTED_OUTCOME
91+ private_constant :SourceMethodArity
7492 end
7593end
0 commit comments