
#include <cassert>
#include <algorithm>
#include <iostream>
#include <complex>
#include <sstream>
using namespace std;

#include <rawinterpreter.h>
#include <scopedependentfunctions.h>


#include <keyboard.h>


class fprint
{
  keyboardinterface& x;
public:

  fprint(keyboardinterface& x_) 
    : x(x_) {}

  void operator()()
    { x.print(); }
};

keyboardinterface::keyboardinterface
(
  string const initinput 
)
{
  // Initialiazation

  rpnprogramstackstate().init();

  inputstatescope inscp;
  SingletonPtr<inputstatescope> init(&inscp);

  initscopedependentfunctions();  

  // Callback to print(); 
  fprint prnt(*this); 


  stringstream ss(initinput.c_str());
  SingletonPtr<inputstatescope>()->fd.process2_silent(ss);

  prnt();

  SingletonPtr<inputstatescope>()->fd.process2(cin,prnt);

}

void keyboardinterface::print()
{
  bool found(false);
  string path;
  
  rpnprogramstackstate().findprogram(
    found,path,rpnprogramstackstate().ps->front() );
  if (!found)
    path = "";
  cout << path << " ";

  deque<rpnbase*>& ds = rpnprogramstackstate().ds();
  cout << "size=" << ds.size();
  cout << "   depth=" << rpnprogramstackstate().ps->size();

  cout << endl;


  if (ds.empty())
    return;

  unsigned int const imax = 10;
  for (unsigned int i= min((unsigned int const)ds.size(),imax); i>0; )
  {
    --i;
    cout << i << ": " << ds[i] << endl;
  }
  cout << "@";
  if (SingletonPtr<inputstatescope>()->evalimmediate)
    cout << "+ ";
  else
    cout << "- ";
}



