#lang racket

;;;;;FOTORRECEPTORES
(define fotorreceptor%
  (class object%
    (init-field
     (tipo '(255 0 0 1.0));sensible al rojo
     )
    (field
     (estado 0)
     )
    (define/public proceso!
      (lambda (estimulo); 1 objeto clase elemento%
        (let ((estimulo-rgb (send estimulo get-rgb))
              )
          (set! 
           estado
           (if (equal? estimulo-rgb tipo)
               1
               0)
           )
          estado
          )
        ))
    (super-new) 
    ))
;;;;;GRUPO DE FOTORRECEPTORES
(define grupo_fotorreceptores%
  (class object%
    (init-field
     (lista-neuronas '())
     )
    (field
     (salida '())
     )
    (define aux_proceso
      (lambda (neuronas e1)
        (if (null? neuronas)
            '()
            (cons
             (send (first neuronas) proceso! e1)
             (aux_proceso (rest neuronas) e1))
            )
        ))
    (define/public proceso!
      (lambda (e1)
        (set! 
         salida
         (aux_proceso 
          lista-neuronas 
          e1))
        salida
        ))
    (super-new)
    ))
;;;;;LA RETINA
(define retina%
  (class object%
    (init-field
     (lista-grupos '())
     )
    (field
     (salida '())
     )
    (define aux_proceso
      (lambda (grupos estimulos)
        (if (null? grupos)
            '()
            (append;cons
             (send (first grupos) proceso! (first estimulos))
             (aux_proceso (rest grupos) (rest estimulos)))
            )
        ))
    (define/public proceso!
      (lambda (estimulos)
        (set! 
         salida
         (aux_proceso 
          lista-grupos 
          estimulos))
        salida
        ))
    (super-new)
    ))
    
;;;;UNA RETINA
(define agrupacion
  (make-object grupo_fotorreceptores%
    (list
     (make-object fotorreceptor% '(255 0 0 1.0))
     (make-object fotorreceptor% '(0 255 0 1.0))
     (make-object fotorreceptor% '(0 0 255 1.0))
     (make-object fotorreceptor% '(255 255 255 1.0))
     (make-object fotorreceptor% '(0 0 0 1.0))
     )
    ))
(define retina 
  (make-object retina%
    (list agrupacion agrupacion agrupacion)))

(provide retina)