# Functions

TablaM provides a small selection of functions available:

## Math

Operations like "`+,-,*,/`" are in fact functions internally. With them is also available:

### Sum

The `sum` function operate on relations of numbers and return the total:

``````fun sum(rel:[Number]) = Number
``````
``````sum(1.0f) -- = 1.0f
sum([1; 2; 3]) -- = 6
``````

### Avg

The `avg` function operate on relations of numbers and return the average of the values:

``````fun avg(rel:[Number]) = Number
``````
``````avg(1.0f) -- = 1.0f
avg([1; 2; 3]) -- = 2
``````

## Logic

### min & max

The `min`& `max` functions accept a relation and return the min or max value, accordingly.

Note that these are logical functions, not math. So it operates on ANY value following the total order of types.

``````fun min(rel:Rel) = Rel
fun max(rel:Rel) = Rel
``````
``````min([1; 2]) -- = 1
max([1; 2]) -- = 2

min([true, 1; 2]) -- = true
max([1; 2; "Hello"]) -- = "Hello"
``````

## IO

To operate with IO (files, stdin, stdout, sockets, etc):

The `print`& `println` functions accept a list of values and convert them to `String` and output the result to the stdout, which is commonly the terminal.

``````fun print(values: Any...)
fun println(values: Any...)
``````
``````print("hello")
print("world")

println("hello")
println("world")
``````

### open

The `open` function load a `.csv` file, scan the header and return it as a relation. Note that this functionality is temporal. Later will be correctly used to open any kind of file.

``````fun open(path: Path) = Rel
``````
``````-- With a csv file like
-- id,ref,name
-- 1,24236-097,Noodles
let products := open("products.csv")

``````

The `read_to_string` function take a `File` and load the contents as a `String`.

``````fun read_to_string(file: File) = String
``````
``````let products := open("products.csv")
``````

### save

The `save` function turn the relation in a `String`, then save the results to the disk. Note that this functionally not yet work correctly.

``````fun save(rel:Rel, path: Path)
``````
``````let products := [
id:Int, ref:Str, name:Str;
1,"24236-097","Noodles"]

save(products, "products.csv")
``````