mirror of
				https://github.com/boostorg/optional.git
				synced 2025-11-04 09:41:37 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			46 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
[section Monadic interface]
 | 
						|
 | 
						|
The monadic interface of `optional` allows the application of functions
 | 
						|
to optional values without resorting to the usage of explicit `if`-statements.
 | 
						|
 | 
						|
Function `map` takes a function mapping type `T` onto type `U` and maps an `optional<T>`
 | 
						|
onto an `optional<U>` using the provided function.
 | 
						|
 | 
						|
    int length(const string& s){ return s.size(); };
 | 
						|
 | 
						|
    optional<string> null{}, thin{""}, word{"word"};
 | 
						|
    assert (null.map(length) == none);
 | 
						|
    assert (thin.map(length) == 0);
 | 
						|
    assert (word.map(length) == 4);
 | 
						|
 | 
						|
Function `flat_map` is similar, but it requires the function to return an
 | 
						|
`optional<V>` for some type `V`. This `optional<V>` becomes the return type of
 | 
						|
`flat_map`.
 | 
						|
 | 
						|
    optional<char> first_char(const string& s) {
 | 
						|
      if (s.empty()) return none;
 | 
						|
      else           return s[0];
 | 
						|
    };
 | 
						|
 | 
						|
    optional<string> null{}, thin{""}, word{"word"};
 | 
						|
    assert (null.flat_map(first_char) == none);
 | 
						|
    assert (thin.flat_map(first_char) == none);
 | 
						|
    assert (word.flat_map(first_char) == 'w');
 | 
						|
 | 
						|
These functions can be combined in one expression reflecting a chain of computations:
 | 
						|
 | 
						|
    auto get_contents(path p) -> optional<string>;
 | 
						|
    auto trim(string) -> string;
 | 
						|
    auto length(string) -> int;
 | 
						|
 | 
						|
    auto trimmed_size_of(optional<path> p) -> int
 | 
						|
    {
 | 
						|
      return p.flat_map(get_contents)
 | 
						|
              .map(trim)
 | 
						|
              .map(length)
 | 
						|
              .value_or(0);
 | 
						|
    }
 | 
						|
 
 | 
						|
 | 
						|
[endsect]
 |