def insert_conversion_step_at_beginning(self, converter: Converter[S, T], inplace: bool = False):
<EOL>if converter.is_generic() and self.is_generic():<EOL><INDENT>raise ValueError('<STR_LIT>')<EOL><DEDENT>elif self.can_be_appended_to(converter, self.strict):<EOL><INDENT>if inplace:<EOL><INDENT>self._converters_list.insert(<NUM_LIT:0>, converter)<EOL>self.from_type = converter.from_type<EOL>return<EOL><DEDENT>else:<EOL><INDENT>new = copy(self)<EOL>new._converters_list.insert(<NUM_LIT:0>, converter)<EOL>new.from_type = converter.from_type<EOL>return new<EOL><DEDENT><DEDENT>else:<EOL><INDENT>raise TypeError('<STR_LIT>' +<EOL>get_pretty_type_str(converter.from_type)<EOL>+ '<STR_LIT>' +<EOL>get_pretty_type_str(self.to_type) + '<STR_LIT>'<EOL>+ ('<STR_LIT>' if self.strict else '<STR_LIT>') + '<STR_LIT>')<EOL><DEDENT>
Utility method to insert a converter at the beginning of this chain. If inplace is True, this object is modified
 and None is returned. Otherwise, a copy is returned

:param converter: the converter to add
:param inplace: boolean indicating whether to modify this object (True) or return a copy (False)
:return: None or a copy with the converter added