def flat_map(self, func: Callable[[T], 'TOption[T]']) -> 'TOption[T]':
        """
        Usage:

            >>> TOption(3).flat_map(lambda x: TOption(x+1)).get()
            4
            >>> TOption(3).flat_map(lambda x: TOption(None)).get_or(999)
            999
            >>> TOption(None).flat_map(lambda x: TOption(x+1)).get_or(999)
            999
        """
        return self if self.is_none() else TOption(func(self.value).get())