#lang racket

;;;;;;;;;;;;;;;;;;;;;
(define control_central%
  (class object%
    ;;field: propiedades estructurales
    (field
     (accion #f)
     (comparar equal?)
     )
    ;;;;;;;;;;;;;;;;;;;;
    (define reconocimiento-par
      (lambda (par)
        (define tabla
          (list
           (cons (cons 0 0) 'blanco)
           (cons (cons 1 1) 'comida)
           (cons (cons 0 1) 'obstaculo)))
        (ormap
         (lambda (fila)
           (if (comparar (car fila) par)
               (cdr fila)
               #f)
           )
         tabla)
        ))
    (define reconocimiento-precognitivo
      (lambda (output_sensitivo)
        (map
         (lambda (par)
           (reconocimiento-par par)
           )
         output_sensitivo)
        ))
    (define sensation->order
      (lambda (output_sensitivo action)
        (let* ((R_os (reconocimiento-precognitivo output_sensitivo))
               (comidas
                (filter-map
                 (lambda (clave orden)
                   (if (comparar clave 'comida)
                       orden
                       #f)
                   )
                 R_os '(0 1 2 3 4 5 6 7)) )
               (blancos
                (filter-map
                 (lambda (clave orden)
                   (if (comparar clave 'blanco)
                       orden
                       #f)
                   )
                 R_os '(0 1 2 3 4 5 6 7)) )
               )
          (if (null? comidas)
              (if action action (first blancos))
              (first comidas)
              )
          )
        ))
    (define/public proceso!
      (lambda (output_receptor last-action)
        (set! accion (sensation->order output_receptor last-action))
        (values accion)
        ))
    (super-new)
    ))
;;;;;;;;;;;
(define cerebro (make-object control_central%))


(provide cerebro)


          
