# `acme-zero` and `acme-one`

[Cabal][cabal] package dependencies form a commutative monoid with an absorbing
element. They satisfy the following axioms:

[cabal]: https://www.haskell.org/cabal/users-guide/developing-packages.html

* **Associativity**

  For all dependencies `a`, `b` and `c`,

  ```
  (a , b) , c = a , (b , c)
  ```

  In fact, the Cabal syntax does not even allow you to use the parentheses for
  this reason.

* **Commutativity**

  For all dependencies `a` and `b`,

  ```
  a , b = b , a
  ```

* **Identity element**

  For all dependencies `a`,

  ```
  acme-one , a = a , acme-one = a
  ```

  Depending on [`acme-one`][acme-one] has no additional effect.

* **Absorbing element**

  For all dependencies `a`,

  ```
  acme-zero , a = a , acme-zero = acme-zero
  ```

  Depending on [`acme-zero`][acme-zero] in addition has the same effect as
  *only* depending on `acme-zero`.

[acme-one]:  https://hackage.haskell.org/package/acme-one
[acme-zero]: https://hackage.haskell.org/package/acme-zero