1*** Settings ***
2Documentation  This module contains keywords for list manipulation.
3Library  Collections
4
5*** Keywords ***
6Smart Combine Lists
7    [Documentation]  Combine all valid list arguments and return the result.
8    [Arguments]  @{lists}
9
10    # Description of argument(s):
11    # lists  A list of lists to be combined.  Any item in this list which is
12    #        NOT a list will be removed.
13
14    ${list_size}=  Get Length  ${lists}
15    ${index}=  Set Variable  ${0}
16    : FOR  ${arg}  IN  @{lists}
17    \    ${type_arg}=  Evaluate  str(type($lists[${index}])).split("'")[1]
18    \    Run Keyword If  '${type_arg}' != 'list'  Run Keywords
19    ...      Remove From List  ${lists}  ${index}  AND
20    ...      Continue For Loop
21    \    ${index}=  Evaluate  ${index}+1
22
23    ${new_list}=  Combine Lists  @{lists}
24
25    [Return]  ${new_list}
26
27
28Intersect Lists
29    [Documentation]  Intersects the two lists passed in. Returns a list of
30    ...  values common to both lists with no duplicates.
31    [Arguments]  ${list1}  ${list2}
32
33    # list1      The first list to intersect.
34    # list2      The second list to intersect.
35
36    ${length1}=  Get Length  ${list1}
37    ${length2}=  Get Length  ${list2}
38
39    @{intersected_list}  Create List
40
41    @{larger_list}=  Set Variable If  ${length1} >= ${length2}  ${list1}
42    ...                               ${length1} < ${length2}  ${list2}
43    @{smaller_list}=  Set Variable If  ${length1} >= ${length2}  ${list2}
44    ...                                ${length1} < ${length2}  ${list1}
45
46    :FOR  ${element}  IN  @{larger_list}
47    \  ${rc}=  Run Keyword and Return Status  List Should Contain Value
48    ...  ${smaller_list}  ${element}
49    \  Run Keyword If  '${rc}' == 'True'  Append to List  ${intersected_list}
50    ...  ${element}
51
52    @{intersected_list}=  Remove Duplicates  ${intersected_list}
53
54    [Return]  @{intersected_list}
55
56
57Subtract Lists
58    [Documentation]  Subtract list 2 from list 1 and return the result.
59    #  Return list contain items from the list 1 which are not present
60    #  in the list 2.
61    [Arguments]  ${list1}  ${list2}
62    # Description of argument(s):
63    # list1      The base list which is to be subtracted from.
64    # list2      The list which is to be subtracted from list1.
65
66    ${diff_list}=  Create List
67    :FOR  ${item}  IN  @{list1}
68    \  ${status}=  Run Keyword And Return Status
69    ...  Should Contain  ${list2}  ${item}
70    \  Run Keyword If  '${status}' == '${False}'
71    ...  Append To List  ${diff_list}  ${item}
72
73    [Return]  ${diff_list}
74