'use strict';

var Curry = require("./curry.js");
var Caml_option = require("./caml_option.js");

function make(param) {
  return {
          root: undefined
        };
}

function clear(s) {
  s.root = undefined;
}

function copy(s) {
  return {
          root: s.root
        };
}

function push(s, x) {
  s.root = {
    head: x,
    tail: s.root
  };
}

function topUndefined(s) {
  var x = s.root;
  if (x !== undefined) {
    return x.head;
  }
  
}

function top(s) {
  var x = s.root;
  if (x !== undefined) {
    return Caml_option.some(x.head);
  }
  
}

function isEmpty(s) {
  return s.root === undefined;
}

function popUndefined(s) {
  var x = s.root;
  if (x !== undefined) {
    s.root = x.tail;
    return x.head;
  }
  
}

function pop(s) {
  var x = s.root;
  if (x !== undefined) {
    s.root = x.tail;
    return Caml_option.some(x.head);
  }
  
}

function size(s) {
  var x = s.root;
  if (x !== undefined) {
    var _x = x;
    var _acc = 0;
    while(true) {
      var acc = _acc;
      var x$1 = _x;
      var x$2 = x$1.tail;
      if (x$2 === undefined) {
        return acc + 1 | 0;
      }
      _acc = acc + 1 | 0;
      _x = x$2;
      continue ;
    };
  } else {
    return 0;
  }
}

function forEachU(s, f) {
  var _s = s.root;
  while(true) {
    var s$1 = _s;
    if (s$1 === undefined) {
      return ;
    }
    f(s$1.head);
    _s = s$1.tail;
    continue ;
  };
}

function forEach(s, f) {
  forEachU(s, Curry.__1(f));
}

function dynamicPopIterU(s, f) {
  while(true) {
    var match = s.root;
    if (match === undefined) {
      return ;
    }
    s.root = match.tail;
    f(match.head);
    continue ;
  };
}

function dynamicPopIter(s, f) {
  dynamicPopIterU(s, Curry.__1(f));
}

exports.make = make;
exports.clear = clear;
exports.copy = copy;
exports.push = push;
exports.popUndefined = popUndefined;
exports.pop = pop;
exports.topUndefined = topUndefined;
exports.top = top;
exports.isEmpty = isEmpty;
exports.size = size;
exports.forEachU = forEachU;
exports.forEach = forEach;
exports.dynamicPopIterU = dynamicPopIterU;
exports.dynamicPopIter = dynamicPopIter;
/* No side effect */