# JAVA native implementation of a Java list, hash classes
[hear] (define flex-equals
         (lambda (x y)
           (if (number? / x)
           (if (number? / y)
               (= (x) (y))
               (false))
           (if (number? / y)
               (false)
               (x equals (y))))));

[hear] (define remove-object
         (lambda (x)
           (remove-match (lambda (y)
                   (flex-equals (x) (y))))));

[hear] (define contains-object
         (lambda (x lst)
           (if (> (list-length / lst) 0)
           (if (flex-equals (head / lst) (x))
               (true)
               (contains-object (x) (tail / lst)))
           (false))));

[hear] (class COS_JList ()
              (field super ((java lang Object) new))
              (method unknown (lambda (x) (super (x))))
              (field contents (cell new (vector)))
              (method <init>-V (self))
              (method <init> (self <init>-V))
              (method add-Object-V (lambda (x)
                    (contents set (prepend (x) (contents get)))))
              (method add (self add-Object-V))
              (method remove-Object-Z (lambda (x)
                   (contents set
                         (remove-object (x) (contents get)))))
              (method remove (self remove-Object-Z))
              (method contains-Object-Z (lambda (x)
                          (contains-object (x) (contents get))))
              (method contains (self contains-Object-Z))
              (method get-I-Object (lambda (x)
                    (list-ref (contents get) (x))))
              (method get (self get-I-Object))
              (method iterator-Iterator (COS_JListIterator new (self)))
              (method iterator (self iterator-Iterator))
              (method size-V-I (list-length (contents get)))
              (method size (self size-V-I)));

              
[hear] (define test1 (COS_JList new));

[hear] (begin (test1 add-Object-V (test1))
              (= 1 / test1 size-V-I));

[hear] (test1 == (test1 get-I-Object 0));

[hear] (class COS_JHashMap ()
              (field super ((java lang Object) new))
              (method unknown (lambda (x) (super (x))))
              (field contents (cell new (? x 0)))
              (method <init>-V (self))
              (method <init> (self <init>-V))
              (method put-Object-Object-V (lambda (x y)
                            (let ((prev / contents get))
                              (contents set
                                (? z
                                   (if (flex-equals (z) (x))
                                   (y)
                                   (prev (z))))))))
              (method put (self put-Object-Object-V))
              (method get-Object-Object (lambda (x)
                          (contents get (x))))
              (method get (self get-Object-Object)));

[hear] (define test2 (COS_JHashMap new));

[hear] (begin (test2 put-Object-Object-V 5 10)
              (= 10 / test2 get 5));

       # There is Java code for COS_JList available
       # There is Java code for COS_JHashMap available