<!DOCTYPE html>
<html>

  <head>
    <script data-require="jquery@*" data-semver="3.1.1" src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script data-require="ramda@*" data-semver="0.24.1" src="https://unpkg.com/ramda@0.24.1/dist/ramda.min.js"></script>
    <link rel="stylesheet" href="style.css" />
  </head>

  <body>
    <pre id="objMsg"></pre>
    <script src="script.js"></script>
  </body>

</html>

var o = {a: [{f: 0, g: 3}]}; 

var o1 = R.set(R.compose(R.lensProp('a'), R.lensIndex(0), R.lensProp('f')), 1, o);

log('length after set ' + o1.a.length); 
logObj(o1); 
// => {a: [{f: 1, g: 3}]}

//============================//

var initialState = {
  tree: {
    text: "app",
    childNodes: [{
      text: 'core',
      childNodes: [{
        text: 'store',
        childNodes: [],
        expanded: false,
        path: ['tree', 'childNodes', 0, 'childNodes', 0]
      }, {
        text: 'service',
        childNodes: [],
        expanded: false,
        path: ['tree', 'childNodes', 0, 'childNodes', 1]
      }],
      expanded: false,
      path: ['tree', 'childNodes', 0]
    }],
    expanded: false,
    path: 'tree'
  }
};
//==============
log('new state')
logObj(initialState);
log('dispatching EXPAND for service');
var newState = reducer(initialState, {
  type: 'expand',
  payload: ['tree', 'childNodes', 0, 'childNodes', 1,'expanded'] //works with 0.24.1 version
});
log('new state')
logObj(newState); 
//================


//==============

log('dispatching COLLAPSE for service');
newState = reducer(initialState, {
  type: 'collapse',
  payload: ['tree', 'childNodes', 0, 'childNodes', 1] //works with 0.24.1 version
});
log('new state')
logObj(newState); 
//================

//==============

log('dispatching TOGGLE for service');
newState = reducer(initialState, {
  type: 'toggle',
  payload: ['tree', 'childNodes', 0, 'childNodes', 1] 
});
log('new state')
logObj(newState); 
//================



function reducer(state, action) {
  log('Previous State');
  logObj(state);
  switch (action.type) { 
    case 'expand':
      {
        log('Reducer: received action- ' + action.type);
        let path =R.lensPath(R.append('expanded',action.payload));
        return R.set(path, true, state);
      }
       case 'collapse':
      {
        log('Reducer: received action- ' + action.type);
         let path =R.lensPath(R.append('expanded',action.payload));
        return R.set(path, false, state);
      }
       case 'toggle':
      {
         log('Reducer: received action- ' + action.type);
         let path = R.lensPath(R.append('expanded',action.payload));
         let val =R.view(path, state);
         log('expanded: '+val);
         return R.over(path, R.not, state);
      }
      default: return state;
  }
}


function log(msg) {
  document.write("== == == == ==<br>");
  document.write('<b style="color:red">' + msg + '</b>');
  document.write("<br>== == == == ==");
}

function logObj(obj) {
  document.write("== == == == ==<br>");
  var msg = JSON.stringify(obj, undefined, 4);
  document.write('<textarea style="color:blue">' + msg + '</textarea>');
  document.write("<br>== == == == ==");
}
/* Styles go here */