def _compose_hook(context: FunctionContext) -> Type: compose = _get_compose_type(context) inferred = infer.infer_function_type_arguments(compose, [ arg for args in context.arg_types for arg in args ], [kind for kinds in context.arg_kinds for kind in kinds], [[ i, i ] for i in range(len([arg for args in context.arg_types for arg in args]))]) ret_type = context.api.expr_checker.apply_inferred_arguments( compose, inferred, context.context).ret_type ret_type.variables = [] return ret_type
def _effect_lift_call_hook(context: MethodContext) -> Type: try: f = context.type.args[0] if isinstance(f, AnyType): return context.default_return_type as_ = [] rs = [] es = [] for effect_type in context.arg_types: r, e, a = get_proper_type(effect_type[0]).args as_.append(a) rs.append(r) es.append(e) inferred = infer.infer_function_type_arguments( f, as_, [kind for kinds in context.arg_kinds for kind in kinds], [[i, i] for i in range(len(as_))]) a = context.api.expr_checker.apply_inferred_arguments( f, inferred, context.context).ret_type r = reduce(_combine_environments, rs) e = UnionType.make_union(sorted(set(es), key=str)) return context.default_return_type.copy_modified(args=[r, e, a]) except AttributeError: return context.default_return_type