/* 1999-2003, Rony G. Flatscher, Wirtschaftsuniversitaet Wien, Austria, Europe
   A *possible* solution to excercise: 9+10+11 (2)
*/


Fruit_Bag = .bag~of( "Apfel", "Apfel", "Birne", "Erdbeere", "Apfel", "Banane",        ,
                     "Zwetschke", "Zwetschke", "Banane", "Apfel", "Birne", "Papaya",  ,
                     "Erdnuss", "Erdnuss", "Erdnuss", "Erdnuss", "Erdnuss", "Apfel",  ,
                     "Erdnuss", "Ananas", "Banane", "Zwetschke", "Birne", "Birne",    ,
                     "Zwetschke", "Zwetschke", "Banane", "Apfel", "Birne", "Papaya",  ,
                     "Erdnuss", "Erdnuss", "Erdnuss", "Apfel", "Erdnuss", "Ananas",   ,
                     "Banane", "Erdnuss", "Erdnuss", "Erdnuss", "Erdnuss", "Erdnuss", ,
                     "Apfel", "Erdnuss", "Ananas", "Banane", "Erdnuss", "Papaya",     ,
                     "Mango", "Erdnuss", "Erdnuss", "Apfel", "Erdnuss", "Ananas",     ,
                     "Banane", "Birne" )

Ordered_List      = .list~of("Apfel", "Banane", "Birne", "Zwetschke")
Fruit_Set         = .set~new~union(Fruit_Bag)
Ordered_Fruit_Set = Fruit_Set~intersection(Ordered_List)
Other_Fruit_Set   = Fruit_Set~difference(Ordered_List)

CALL dump Fruit_Bag, Ordered_Fruit_Set, "Received Fruits (ordered)",     .false
CALL dump Fruit_Bag, Other_Fruit_Set,   "Received Fruits (not ordered)", .false

CALL dump Fruit_Bag, Ordered_List,      "Received Fruits (ordered)",     .true
CALL dump Fruit_Bag, Other_Fruit_Set,   "Received Fruits (not ordered)", .true


::ROUTINE dump
  USE ARG bag, collection, title, bWithCount

  bWithCount = (bWithCount="1")

  SAY title
  tmpString = ""
  DO fruit OVER collection
     IF \(bag~hasindex(fruit)) THEN ITERATE
     IF bWithCount THEN tmpString = ":" RIGHT(bag~allat(fruit)~items, 3)
     SAY RIGHT(fruit, 21) || tmpString
  END
  SAY
  RETURN