# Class `pl.Set`

A Set class.

    > Set = require 'pl.Set'
    > = Set{'one','two'} == Set{'two','one'}
    true
    > fruit = Set{'apple','banana','orange'}
    > = fruit['banana']
    true
    > = fruit['hazelnut']
    nil
    > colours = Set{'red','orange','green','blue'}
    > = fruit,colours
    [apple,orange,banana]   [blue,green,orange,red]
    > = fruit+colours
    [blue,green,apple,red,orange,banana]
    [orange]
    > more_fruits = fruit + 'apricot'
    > = fruit*colours
     =  more_fruits, fruit
    banana,apricot,apple,orange]    [banana,apple,orange]

Dependencies: pl.utils, pl.tablex, pl.class, pl.Map, (pl.List if __tostring is used)

## Methods

pl.set:Set (t) | create a set.
pl.set:values (self) | get a list of the values in a set.
pl.set:map (self, fn, ...) | map a function over the values of a set.
pl.set:union (self, set) | union of two sets (also +).
pl.set:intersection (self, set) | intersection of two sets (also *).
pl.set:difference (self, set) | new set with elements in the set that are not in the other (also -).
pl.set:issubset (self, set) | is the first set a subset of the second (also <)?.
pl.set:isempty (self) | is the set empty?.
pl.set:isdisjoint (s1, s2) | are the sets disjoint?
pl.set:len (s) | size of this set (also # for 5.2).

## Metamethods

pl.set:__tostring () | string representation of a set.
pl.set:__add () | union of sets.
pl.set:__mul () | intersection of sets.
pl.set:__sub () | difference of sets.
pl.set:__pow () | symmetric difference of sets.
pl.set:__lt () | first set subset of second?
pl.set:__len () | cardinality of set (5.2).
pl.set:__eq (s1, s2) | equality between sets.

## Methods

pl.set:Set (t)
  create a set.

  ### Parameters:

  - t may be a Set, Map or list-like table.
pl.set:values (self)
  get a list of the values in a set.

  ### Parameters:

  - self a Set

  ### Returns:

  a list
pl.set:map (self, fn, ...)
  map a function over the values of a set.

  ### Parameters:

  - self a Set
  - fn a function
  - ... extra arguments to pass to the function.

  ### Returns:

  a new set
pl.set:union (self, set)
  union of two sets (also +).

  ### Parameters:

  - self a Set
  - set another set

  ### Returns:

  a new set
pl.set:intersection (self, set)
  intersection of two sets (also *).

  ### Parameters:

  - self a Set
  - set another set

  ### Returns:

  a new set

  ### Usage:

      > s = Set{10,20,30}
      > t = Set{20,30,40}
      > = t
      [20,30,40]
      > = Set.intersection(s,t)
      [30,20]
      > = s*t
      [30,20]

pl.set:difference (self, set)
  new set with elements in the set that are not in the other (also -).

  ### Parameters:

  - self a Set
  - set another set

  ### Returns:

  a new set
pl.set:issubset (self, set)
  is the first set a subset of the second (also <)?.

  ### Parameters:

  - self a Set
  - set another set

  ### Returns:

  true or false
pl.set:isempty (self)
  is the set empty?.

  ### Parameters:

  - self a Set

  ### Returns:

  true or false
pl.set:isdisjoint (s1, s2)
  are the sets disjoint? (no elements in common). Uses naive definition, i.e. that intersection is empty

  ### Parameters:

  - s1 a Set
  - s2 another set

  ### Returns:

  true or false
pl.set:len (s)
  size of this set (also # for 5.2).

  ### Parameters:

  - s a Set

  ### Returns:

  size

## Metamethods

pl.set:__tostring ()
  string representation of a set.
pl.set:__add ()
  union of sets.
pl.set:__mul ()
  intersection of sets.
pl.set:__sub ()
  difference of sets.
pl.set:__pow ()
  symmetric difference of sets.
pl.set:__lt ()
  first set subset of second?
pl.set:__len ()
  cardinality of set (5.2).
pl.set:__eq (s1, s2)
  equality between sets.

  ### Parameters:

  - s1
  - s2

generated by LDoc 1.5.0