====Objective:==== Learn the basics of Elixir. ---- ====Preparation:==== Install Elixir on your own machine. Use Erlang OTP version 19 (or more recent versions). ---- ====Deliverables:==== Create a module named ''Elixir_Intro'' that contains the following functions: * ''fib/1'' * ''area/2'' * ''sqrList/1'' * ''calcTotals/1'' * ''map/2'' * ''quickSortServer/0'' You do not need to validate function input. === fib === def fib(n) do ... fib will return the n'th Fibonacci number where ''fib(1) = 1'', ''fib(2) = 1'', and ''fib(n) = fib(n-1) + fib(n-2).'' === area=== def area(shape, shape_info) do .... Area takes either '':rectangle'', '':square'', '':circle'', or '':triangle'' and the shape info, and returns its area. Note for rectangle the shape Info will be a tuple ''{length, height}'', triangle's shape_info will be a tuple ''{base, height}'', and circle and square will each get a single scalar (radius and side length, respectively). Use pattern matching. Also note that pi is called via :math.pi . === sqrList == def sqrList(nums) do .... Returns a new list in which each item of ''nums'' has been squared. === calcTotals === def calcTotals(inventory) do ... Takes an inventory list of tuples of the form ''{item, quantity, price}'' and returns a list of the form ''{item, total_price}''. (Treat the list item by item: no need to consider the possibility of multiple tuples with the same "item" name.) === map === def map(function, vals) do ... Map takes a function and a list vals and applies that function to each item in the list. Note that when using higher order functions in Elixir, you use ''&Module.functionName/arity'' to pass it, and ''functionName.(…)'' to call it. Thus,to test it, the call should look like this ''map(&Module.functionName/arity, list)''. For this lab, you can assume the arity of the function being passed in is 1. === quickSortServer === def quickSortServer() do ... quickSortServer will start a simple server that will receive a list and sort it and send it to the caller. It should sort via a modified version of quickSort as discussed in class. quickSort will choose the pivot randomly, and you will need to implement the new pivot functionality. The module ''random'' function '':random.uniform(N)'' will be useful for this, as well as '':lists.nth(N, List)'' Remember that starting a new process would look like ''pid = spawn &Elixir_Intro.quickSortServer/0'' To test your quickSortServer(), it might be helpful to set up a simple client module like this: defmodule Client do def callServer(pid,nums) do send(pid, {nums, self()}) listen() end def listen do receive do {sorted, pid} -> sorted end end end