| Home | Libraries | People | FAQ | More

### Maps

By definition a map is set of pairs. So we would expect maps to obey the same laws that are valid for sets. Yet the semantics of the icl's maps may be a different one, because of it's aggregating facilities, where the aggregating combiner operations are passed to combine the map's associated values. It turns out, that the aggregation on overlap principle induces semantic properties to icl maps in such a way, that the set of equations that are valid will depend on the semantics of the type `CodomainT` of the map's associated values.

This is less magical as it might seem at first glance. If, for instance, we instantiate an `interval_map` to collect and concatenate `std::strings` associated to intervals,

    interval_map<int,std::string> cat_map;
    cat_map += make_pair(interval<int>::rightopen(1,5),std::string("Hello"));
    cat_map += make_pair(interval<int>::rightopen(3,7),std::string(" World"));
    cout << "cat_map: " << cat_map << endl;

we won't be able to apply `operator -=`

    // This will not compile because string::operator -= is missing.
    cat_map -= make_pair(interval<int>::rightopen(3,7),std::string(" World"));

because, as std::sting does not implement `-=` itself, this won't compile. So all laws, that rely on `operator -=` or `-` not only will not be valid they can not even be stated. This reduces the set of laws that can be valid for a richer `CodomainT` type to a smaller set of laws and thus to a less restricted semantics.

Currently we have investigated and validated two major instantiations of icl::Maps,

- Maps of Sets that will be called Collectors and
- Maps of Numbers which will be called Quantifiers

both of which seem to have many interesting use cases for practical applications. The semantics associated with the term Numbers is a commutative monoid for unsigned numbers and a commutative or abelian group for signed numbers. From a practical point of view we can think of numbers as counting or quantifying the key values of the map.

Icl Maps of Sets or Collectors are models of concept `Set`. This implies that all laws that have been stated as a semantics for `icl::Sets` in the previous chapter also hold for `Maps of Sets`. Icl Maps of Numbers or Quantifiers on the contrary are not models of concept `Set`. But there is a substantial intersection of laws that apply both for `Collectors` and `Quantifiers`.

Kind of Map | Alias | Behavior
--- | --- | ---
Maps of Sets | Collector | Collects items for key values
Maps of Numbers | Quantifier | Counts or quantifies the key values

In the next two sections the law based semantics of Collectors and Quantifiers will be described in more detail.