IMCScript built-in functions

Prev Next

IMCScript offers a rich library of built-in constants and functions to help you define and execute custom logic with minimal code. The script engine supports mathematical operations, language constants, statistical calculations, expression-based queries, parsing utilities, and integration with external data such as GeoJSON and Google Maps.

Use this reference to explore what’s available and how to use each function effectively.

Math constants

Use the following constants to improve script readability.

Math.PI     ;   // Outcome: 3.141592653589793
Math.E      ;   // Outcome: 2.718281828459045

Language constants

Language constants help you retrieve standardized language-country codes based on international conventions. Common examples include:

Lang.GERMAN;              // Outcome: "de"
Lang.ENGLISH;             // Outcome: "en"
Lang.CHINESE;             // Outcome: "zh"
Lang.TRADITIONAL_CHINESE; // Outcome: "zh_TW"

Standard functions

Summation (sum)

Adds all provided values. Accepts comma-separated or array inputs.

Math.sum(10, 20, 30)    ;   // Outcome: 60
Math.sum([1, 2, 3, 4])  ;   // Outcome: 10

Multiplication (mul)

Multiplies all values.

Math.mul(1, 2, 3)         ;   // Outcome: 6
Math.mul([2, 3, 5, 1])    ;   // Outcome: 30

Absolute (abs)

Returns the non-negative version of a number.

Math.abs(-7)   ;   // Outcome: 7
Math.abs(7)    ;   // Outcome: 7

Maximum (max)

Returns the highest number from a list.

Math.max(4, 11)               ;   // Outcome: 11
Math.max(1, 2, 1, 7, 9)       ;   // Outcome: 9
Math.max([1, 2, 1, 7, 9])     ;   // Outcome: 9

Minimum (min)

Returns the lowest number from a list.

Math.min(4, 11)             ;   // Outcome: 4
Math.min(1, 2, 1, 7, 9)     ;   // Outcome: 1
Math.min([1, 2, 1, 7, 9])   ;   // Outcome: 1

Average (avg)

Calculates the arithmetic mean. Equivalent to the mean fucntion.

Math.avg(4, 7)                     ;   // Outcome: 5.4
Math.avg(6, 4.5, 11.5, 2)          ;   // Outcome: 6
Math.avg([6, 4.5, 11.5, 2])        ;   // Outcome: 6

Greatest common divisor (gcd)

Returns the greatest common divisor (GCD) of the provided numbers.

Math.gcd(24, 18)             ;   // Outcome: 6
Math.gcd(50, 24, 18)         ;   // Outcome: 2
Math.gcd([50, 24, 18])       ;   // Outcome: 2

Least common multiplier (lcm)

Returns the least common multiplier (LCM) of the provided numbers.

Math.lcm(16, 4)                  ;   // Outcome: 16
Math.lcm(32, 12, 16, 2)          ;   // Outcome: 96
Math.lcm([32, 12, 16, 2])        ;   // Outcome: 96

Convergence functions

Round (round)

Rounds a number to the specified number of decimal places. The default number of decimal places is 2.

Math.round(3.1345964, 4)     ;   // Outcome: 3.1346
Math.round(3.1345964)        ;   // Outcome: 3.13

Ceiling (ceil)

Rounds a number up to the next largest whole number or integer. Returns 0 and does not give a NaN error if the input is null.

Math.ceil(7.345)    ;   // Outcome: 8
Math.ceil(-7.345)   ;   // Outcome: -7

Floor (floor)

Returns the largest integer that is less than or equal to a given number.

Math.floor(7.345)    ;   // Outcome: 7
Math.floor(-7.345)   ;   // Outcome: -8

Statistical functions

Mean (mean)

Calculates the arithmetic mean. Equivalent to the avg function.

Math.mean(4, 7)                      ;   // Outcome: 5.4
Math.mean(6, 4.5, 11.5, 2)           ;   // Outcome: 6
Math.mean([6, 4.5, 11.5, 2])         ;   // Outcome: 6

Median (median)

Returns the middle value from a sorted list.

Math.median(3, 2, 7, 1, 9, 2, 10)         ;   // Outcome: 3
Math.median(1, 2, 3, 4, 5, 6)             ;   // Outcome: 3.5
Math.median([1, 2, 3, 4, 5, 6])           ;   // Outcome: 3.5

Mode (mode)

Returns the most frequently occurring numbers. If there are multiple modes, the function returns them as an array. The function doesn’t guarantee the order of the returned values.

Math.mode(8, 2, 7, 2, 9, 2, 10)           ;   // Outcome: [2]
Math.mode([1, 3, 3, 4, 2, 5, 2])          ;   // Outcome: [3, 2]
Math.mode(1, 2, 3, 4, 5)                  ;   // Outcome: []
Math.mode(1, 1, 2, 2, 3, 3)               ;   // Outcome: [1, 2, 3]

Exponential Functions

Power (pow)

Raises a base number to a given exponent.

Math.pow(2, 3)        ;   // Outcome: 8
Math.pow(5, 2)        ;   // Outcome: 25

Root (root)

Returns the nth root of a number. If multiple roots exist, returns the positive root only.

Math.root(16, 4)      ;   // Outcome: 2
Math.root(3, 2)       ;   // Outcome: 1.7320508075688772

Square (sq)

Returns the square of a number. Equivalent to pow(n,2).

Math.sq(3)            ;   // Outcome: 9
Math.sq(5)            ;   // Outcome: 25

Square root (sqrt)

Returns the square of a number. If multiple roots exist, returns the positive square root only. Equivalent to root(n,2).

Math.sqrt(25)         ;   // Outcome: 5
Math.sqrt(2)          ;   // Outcome: 1.4142135623730951

Cube root (cbrt)

Returns the cube root of a number. Equivalent to root(n, 3).

Math.cbrt(27)         ;   // Outcome: 3
Math.cbrt(15)         ;   // Outcome: 2.4662120743304703

Trigonometric Functions

Degree to radian (rad)

Converts degrees to radians.

Math.rad(90)          ;   // Outcome: 1.5707963267948966
Math.rad(45)          ;   // Outcome: 0.7853981633974483

Radian to degree (deg)

Converts radians to degrees.

Math.deg(1.5707963267948966)    ;   // Outcome: 90
Math.deg(0.7853981633974483)    ;   // Outcome: 45

Sine (sin)

Returns the sine of a double.

Math.sin(0)                  ;   // Outcome: 0
Math.sin(Math.rad(45))       ;   // Outcome: 0.7071067811865475

Cosine (cos)

Returns the cosine of a double.

Math.cos(0)                  ;   // Outcome: 1
Math.cos(Math.rad(45))       ;   // Outcome: 0.7071067811865475

Tangent (tan)

Returns the tangent of a double.

Math.tan(0)                   ;   // Outcome: 0
Math.tan(Math.rad(45))       ;   // Outcome: 0.9999999999999999

Arcsine (asin)

Returns the arcsine of a double. This function is the inverse of the sine.

Math.asin(0.70)              ;   // Outcome: 0.775397496610753
Math.asin(Math.sin(1))       ;   // Outcome: 1

Arc cosine (acos)

Returns the arc cosine of a double. This function is the inverse of the cosine.

Math.acos(0.70)              ;   // Outcome: 0.7953988301841436
Math.acos(Math.cos(1))       ;   // Outcome: 1

Arc tangent (atan)

Returns the arc tangent of a double. This function is the inverse of the tangent.

Math.atan(0.70)              ;   // Outcome: 0.6107259643892086
Math.atan(Math.tan(1))       ;   // Outcome: 1

Logarithmic Functions

Logarithm (log)

Calculates the logarithm of a number using the provided base. The default base is e—the base of natural algorithms.

Math.log(100, 10)            ;   // Outcome: 2
Math.log(Math.E)             ;   // Outcome: 1

Base 10 logarithm (log10)

Calculates the logarithm of a number using base 10. Equivalent to log(n,10).

Math.log10(100)              ;   // Outcome: 2
Math.log10(30)               ;   // Outcome: 1.4771212547196624

Parsing functions

Parsing functions help parse one data type into another.

String.parse(5)              ;   // Outcome: "5"
String.parse(3.12)           ;   // Outcome: "3.12"
String.parse("Hello")        ;   // Outcome: "Hello"

Integer.parse("5")           ;   // Outcome: 5
Integer.parse("5.12")        ;   // Outcome: 5
Integer.parse("A")           ;   // Outcome: FAILURE

Double.parse("5")            ;   // Outcome: 5
Double.parse("5.12")         ;   // Outcome: 5.12
Double.parse("A")            ;   // Outcome: FAILURE

Check functions

isFinite

Returns true if the input is a finite number. Returns false in other cases, for example, if the input is NaN (not a number) or an infinity argument.

Math.isFinite(5)             ;   // Outcome: true
Math.isFinite(NaN)           ;   // Outcome: false
Math.isFinite(Math.log(0))   ;   // Outcome: false

isNan

Returns true if the input is NaN (not a number).

Math.isNaN(5)                ;   // Outcome: false
Math.isNaN(NaN)              ;   // Outcome: true
Math.isNaN(Math.log(0))      ;   // Outcome: false

ExpressionBean functions

intersection

Returns the common elements between two ExpressionBeans.

var allSalesItems = Quote().includesSalesItem._objectName;   // ["SalesItem1", "SalesItem2"]
var currSalesItem = SalesItem().objectName;                  // ["SalesItem2"]

allSalesItems.intersection(currSalesItem);                   // Outcome: ["SalesItem2"]

subtraction

Returns the elements present in one ExpressionBean but not in the other.

var allSalesItems = Quote().includesSalesItem._objectName;   // ["SalesItem1", "SalesItem2"]
var currSalesItem = SalesItem().objectName;                  // ["SalesItem2"]

allSalesItems.subtraction(currSalesItem);                    // Outcome: ["SalesItem1"]

union

Combines all unique elements from ExpressionBeans into a single set.

var allSalesItems = Quote().includesSalesItem._objectName;   // ["SalesItem1", "SalesItem2"]
var currQuote = Quote().objectName;                          // ["Quote1"]

allSalesItems.union(currQuote);                              // Outcome: ["SalesItem1", "SalesItem2", "Quote1"]

contains

Checks if an ExpressionBean contains a specific element.

var firstLevelISI = Quote().includesSalesItem[0];
var secondLevelISI = firstLevelISI.includesSalesItem[0];

var result  = Quote().includesSalesItem._contains(firstLevelISI);    // Outcome: true
var result2 = firstLevelISI.contains(firstLevelISI);                 // Outcome: true
var result3 = firstLevelISI.contains(secondLevelISI);                // Outcome: true

indexOf

Returns the index of a specific element in the ExpressionBean. If the element doesn’t exist, it returns -1.

var firstLevelISI = Quote().includesSalesItem[0];
var secondLevelISI = firstLevelISI.includesSalesItem[0];

var result  = Quote().includesSalesItem._indexOf(firstLevelISI);     // Outcome: 0
var result2 = firstLevelISI.indexOf(firstLevelISI);                  // Outcome: 0
var result3 = firstLevelISI.indexOf(secondLevelISI);                 // Outcome: -1

equals

Checks whether two ExpressionBeans (either single objects or collections) are equivalent. Equivalent to the equality operator.

var allLevelISI     = Quote().includesSalesItem_;
var firstLevelISI   = Quote().includesSalesItem[0];
var secondLevelISI  = firstLevelISI.includesSalesItem[0];

var result  = Quote().includesSalesItem_[0].equals(firstLevelISI);   // Outcome: true
var result2 = Quote().includesSalesItem_[1].equals(firstLevelISI);   // Outcome: false
var result3 = allLevelISI.equals(allLevelISI);

sort

Sorts an ExpressionBean based on the provided IMCExpression, such as this.salesItemPosition, and a specified sort direction

If you don’t enter an IMCExpression, the function uses the ToString method to sort. The default sort direction is ASC.

var salesItems = Quote().includesSalesItem_;

// Outcome: ["Infield", "Open Field Project", "Submain"]
var filteredSalesItems = salesItems.sort().objectName;

// Outcome: ["Open Field Project", "Infield", "Submain"]
var sortedSalesItems = salesItems.sort("this.salesItemPosition", "ASC").objectName;

// Outcome: ["Submain", "Infield", "Open Field Project"]
var sortedSalesItems2 = salesItems.sort("this.salesItemPosition", "DESC").objectName;

distinct

Returns a collection of distinct elements from the ExpressionBean.

// Outcome: ["Infield", "Open Field Project", "Infield", "Infield", "Open Field Project"]
var salesItems = Quote().includesSalesItem_.objectName;

// Outcome: ["Infield", "Open Field Project"]
var distinctSalesItems = Quote().includesSalesItem_.objectName.distinct();

filter

Filters the ExpressionBean based on the provided IMCExpression, such as this.salesItemPosition, and filter direction, including ASC (ascending) and DESC (descending).

If you don’t enter an IMCExpression, the function uses the ToString method to filter. The default filter direction is ASC.

// Outcome: ["Open Field Project", "Infield"]
var salesItems = Quote().includesSalesItem_.objectName;

// Outcome: ["Infield"]
var filteredSalesItems = Quote().includesSalesItem_._filter("this.isProduct.objectName.contains('Infield')").objectName;

size

Returns the number of elements in the ExpressionBean.

var salesItems = Quote().includesSalesItem_;

var result = salesItems.size();    // Outcome: 2

ExpressionBean (SalesItem) functions

The ExpressionBean library includes special methods that apply only to SalesItem ExpressionBeans. These functions cover two key areas:

  • Dynamic attributes (DA)

  • Google Maps Integration

Dynamic attribute (DA) methods

The following code block contains the dynamic attribute (DA) methods with comments:

// READ
SalesItem().getDA();                               // Returns all DAs connected to SalesItem
SalesItem().getDA("DA1")[0];                       // Returns DA 'DA1'
SalesItem().getDA()[0];                            // Same as getDA("DA1") : Fetches all DAs connected to SalesItem
SalesItem().getDAValue("DA1");                     // Returns all DA values connected to 'DA1'
SalesItem().getDSAValueLabel();                    // Returns DSA value labels connected to SalesItem
SalesItem().getDSAValueLabel('DSA1')[0];           // Returns DSA value label for DSA 'DSA1'
SalesItem().getDAObjectNames();                    // Returns all DA objectNames
SalesItem().getDACurrency();                       // Returns all currencies connected to SalesItem
SalesItem().getDACurrency('DA1')[0];               // Returns currency for DA 'DA1'
SalesItem().getDAMandatory();                      // Returns all mandatory values for SalesItem
SalesItem().getDAMandatory('DA1')[0];              // Returns mandatory value for DA 'DA1'
SalesItem().getDAHidden();                         // Returns all hidden DAs
SalesItem().getDAHidden('DA1')[0];                 // Returns hidden value for DA 'DA1'
SalesItem().getDAReadonly();                       // Returns all readonly DAs
SalesItem().getDAReadonly('DA1')[0];               // Returns readonly value for DA 'DA1'
SalesItem().getDAType();                           // Returns type (String/Number/...) of all DAs
SalesItem().getDAType('DA1');                      // Returns dataType(String/Number/...) of DA 'DA1'
SalesItem().getDSAValueThumbnail('DSA1');          // Returns DSA value thumbnail of DSA 'DSA1'
SalesItem().getDSAValueLabel('DA1', Lang.GERMAN);  // Returns DSA value label in German for DSA 'DSA1'
SalesItem().getDSAValueLabel('DA1', 'en-IN');      // Returns DSA value label in English (India) for DSA 'DSA1'

// UPDATE
SalesItem().setDAValue("DA1", "Apple");            // Sets DA value to 'Apple' for DynamicAttribute 'DA1'
SalesItem().setDAValue("DSA1", "Apple");           // Sets DSA value for DynamicAttribute - 'DSA1'
SalesItem().setDADisabled("DA1", true);            // Hides DynamicAttribute - 'DA1'
SalesItem().setDADisabled("DA1", false);           // Shows DynamicAttribute - 'DA1'
SalesItem().setDAMandatory("DA1", true);           // Sets DynamicAttribute - 'DA1' to be mandatory
SalesItem().setDAMandatory("DA1", false);          // Sets DynamicAttribute - 'DA1' to be non-mandatory
SalesItem().setDACurrency("DA1", SGD);             // Sets currency unit to SGD for 'DA1'

getGeoJSON

The following Google Maps-specific method is available:

SalesItem().getGeoJSON();        // Returns GeoJSON object connected to SalesItem

GeoJSON functions

GeoJSON is a standardized format for encoding geographic data structures. In CPQ, this format is used to store features drawn on Google Maps in a quote.

To view the GeoJSON data of a map, select the Download button at the bottom-left corner of the map window.

image.png

The downloaded file has a .json extension, and you can open it with any text editor. In the file, each feature in the map, such as marker, line, or polygon, is listed under the features array in the JSON file. Every entry includes the following parameters:

  • geometry—Shape, such as marker, line, or polygon, and its coordinates, including latitude and longitude.

  • properties—Custom metadata associated with the feature.

Features can be identified either by their ID (used for predefined objects such as the normalized rectangle or slope arrow) or by their assigned type.

Sample JSON file with GeoJSON data of a map:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [103.84041768669431, 1.2913703203558677],
          [103.83363706230466, 1.28001293311410187],
          [103.86814095907224, 1.2753669124258291],
          [103.86942845939393, 1.287852153483418],
          [103.84041768669431, 1.2913703203558677]
        ]
      },
      "properties": {
        "isPoly": true,
        "area": 487.4,
        "perimeter": 9987,
        "type": "http://www.inmindcloud.com/application/schema.owl#GeoField"
      },
      "id": "dc446d54-946c-4d89-a39a-88426062ceff"
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [103.83110505695946, 1.2951450986549664]
      },
      "properties": {
        "isPoint": true
      }
    }
  ]
}

isFeaturePresent

Checks whether a specific feature exists on the map. You can identify a feature by either its ID or its type URI.

var as = "http://www.inmindcloud.com/application/schema.owl#";
var feature_id = "normalized_rect";
var field_uri = as + "GeoField";
var geoJson = SalesItem().getGeoJSON();

// Check if feature exists using feature ID
if (geoJson.isFeaturePresent(feature_id)) {
  // Work on Google rectangle now that we are sure it exists
}

// Check if feature exists using URI
if (geoJson.isFeaturePresent(field_uri)) {
  // Work on Google rectangle now that we are sure it exists
}

getProperty

Retrieves the value of a custom property from a specific feature. If the feature doesn’t exist or the property isn’t available, the function returns an empty result.

For point features, such as markers, this function also accepts latitude and longitude as property names to return the coordinates, even though these aren’t stored as standard custom properties.

var geojson = SalesItem().getGeoJSON();
var area = geojson.getProperty('normalized_rect', 'area');

LookupTable Functions

table

Defines the lookup table to retrieve data from. Use this function before using the search or searchOn functions, otherwise the script will fail.

It returns DBLookupTable, allowing method chaining.

var table = DBLookupTable.table('table1');  // Outcome: DBLookupTable instance with name 'table1'
table.addSelectFields('field1', 'field2').search();

addSelectFields

Specifies which fields to retrieve from the lookup table. You can pass one or more field names as input. This function is optional. If you don’t use it, all fields will be retrieved by default.

This function returns DBLookupTable, allowing method chaining.

Note

Calling this method a second time will overwrite the previous selection.

// Retrieve all fields
DBLookupTable.table('table1')
  .search();

// Overwrites previous select fields; only 'field3' is retrieved
DBLookupTable.table('table1')
  .addSelectFields('field1', 'field2')
  .addSelectFields('field3')
  .search();

addCondition

Applies one or more filter conditions to the lookup table. Each call adds a new condition, and all conditions are combined using the AND logic. If you don’t use this function, all records from the table will be retrieved without filtering.

This method supports all conditional operators except ternary. Using unsupported operators will result in a script failure.

This function returns DBLookupTable, allowing method chaining.

// Retrieve only records that meet both conditions
DBLookupTable.table('table1')
  .addCondition('field1', '==', 100)
  .addCondition('field2', '==', 'ABC')
  .search();

addOrderBy

Defines how the lookup results should be sorted. You can specify multiple sort fields, and the sort is applied in the order they are defined. If you don’t use this function, the system sorts records by ID by default.

Accepted sort directions are ASC (ascending) or DESC (descending).

This function returns DBLookupTable, allowing method chaining.

// Retrieve records ordered by field1 in ascending order, then by field2 in descending order
DBLookupTable.table('table1')
  .addOrderBy('field1', 'ASC')
  .addOrderBy('field2', 'DESC')
  .search();

search

Retrieves data from the specified lookup table using any previously defined conditions. Returns the result as a list, even if only one record matches the criteria.

// Retrieve all data in the table
var data = DBLookupTable.table('table1').search();

// Access the value of 'field1' for the first record
var value = data[0]['field1'];

searchOne

Retrieves the first matching record from the lookup table based on the defined conditions and sort order. Returns the result as a map. If multiple records match, only the first one is returned.

// Retrieve the first record in the table
var data = DBLookupTable.table('table1').searchOne();

// Access the value of 'field1' for the first record
var value = data['field1'];

System Functions

log

Logs a message to the IMCScript audit log. Supported log types: ERROR, WARNING, and INFO.

System.log('This is an error message', 'ERROR');    // Error message will be logged - RED color
System.log('This is a warning message', 'WARNING'); // Warning message will be logged - BLUE color
System.log('This is an information message', 'INFO'); // Information message will be logged - BLACK color

push

Displays a UI notification of the specified type: ERROR, WARNING, or INFO.

System.push('This is an error message', 'ERROR');     // An error message will be pushed in notification
System.push('This is a warning message', 'WARNING');  // A warning message will be pushed in notification
System.push('This is an information message', 'INFO'); // An info message will be pushed in notification

List Functions

add

Adds an element to the list.

var emptyList = List.create();    // --> []
list.add(5);                      // --> [5]
list.add(8);                      // --> [5, 8]

delete

Deletes an element from the list.

var list = List.create(3, 4, 6, 7);  
list.delete(4);     // --> [3, 6, 7]
list.delete(5);     // --> [3, 6, 7]
list.delete(6);     // --> [3, 7]

deleteAt

Deletes the element at the specified index from the list.

var list = List.create(3, 4, 6, 7);
list.deleteAt(1);   // --> [3, 6, 7]
list.deleteAt(5);   // --> Failure

contains

Checks whether the list contains a specific element.

var list = List.create(4, 5, 6, 7, 8);

var result  = list.contains(5);   // Outcome: true
var result2 = list.contains(10);  // Outcome: false

indexOf

Returns the index of a specified element in the list. If the element doesn’t exist, the function returns -1.

var list = List.create(4, 5, 6, 7, 8);

var result  = list.indexOf(5);    // Outcome: 1
var result2 = list.indexOf(10);   // Outcome: -1

equals

Checks whether two lists are equivalent. This is functionally the same as using the equality operator.

var list  = List.create(4, 5, 6, 7, 8);
var list2 = List.create(4, 5, 6, 7, 8, 8);

var result  = list.equals(list);   // Outcome: true
var result2 = list.equals(list2);  // Outcome: false

sort

Sorts the list in the specified direction: ASC (ascending) or DESC (descending). The default direction is ascending.

var list = List.create(5, 4, 2, 8, 4, 9, 4);

// Outcome: [2, 4, 4, 4, 5, 8, 9]
var sortedList = list.sort();

// Outcome: [9, 8, 5, 4, 4, 4, 2]
var sortedList2 = list.sort("DESC");

distinct

Returns a list of unique elements.

var list = List.create(3, 4, 7, 4, 6, 7);   // --> [3, 4, 7, 4, 6, 7]

return list.distinct();                     // --> [3, 4, 7, 6]

size

Returns the number of elements in the list.

var list        =   List.create(4,5,6,7,8);  
                                    
var result      =   list.size();            // Outcome: 5

Map Functions

add

Adds a key-value pair to the map.

var map         =   Map.create();           // --> {}

map.add('A','Apple') ;                      // --> {'A':'Apple'}
map.add('B','Banana');                      // --> {'A':'Apple','B':'Banana'}

keys

Returns a list of all keys in the map.

var map         =   Map.create();           // --> {}

map.add('A','Apple') ;                      // --> {'A':'Apple'}
map.add('B','Banana');                      // --> {'A':'Apple','B':'Banana'}

map.keys();                                 // Outcome: ["A","B"]

values

Returns a list of all values in the map.

var map         =   Map.create();           // --> {}

map.add('A','Apple') ;                      // --> {'A':'Apple'}
map.add('B','Banana');                      // --> {'A':'Apple','B':'Banana'}

map.values();                               // Outcome: ["Apple","Banana"]

size

Returns the number of key-value pairs in the map.

var map         =   Map.create();           // --> {}

map.add('A','Apple') ;                      // --> {'A':'Apple'}
map.add('B','Banana');                      // --> {'A':'Apple','B':'Banana'}

map.size();                                 // Outcome: 2