///// <summary> ///// I was having a hard day. ///// </summary> ///// <returns></returns> //public string DebugStr() //{ // StringBuilder sb = new StringBuilder(); // sb.Append("<Ref "); // sb.Append(Id); // sb.Append(", "); // if (_tinfo == null) // sb.Append("NO"); // else // sb.AppendFormat("{0} {1}", _tinfo.Status.get(), _tinfo.StartPoint); // sb.Append(", "); // if (_tvals == null) // sb.Append("TVals: NO"); // else // { // sb.Append("TVals: "); // TVal t = _tvals; // do // { // sb.Append(t.Point); // sb.Append(" "); // } while ((t = t.Prior) != _tvals); // } // sb.Append(">"); // return sb.ToString(); //} #endregion #region IDeref Members /// <summary> /// Gets the (immutable) value the reference is holding. /// </summary> /// <returns>The value</returns> public override object deref() { LockingTransaction t = LockingTransaction.getRunning(); if (t == null) { object ret = currentVal(); //Console.WriteLine("Thr {0}, {1}: No-trans get => {2}", Thread.CurrentThread.ManagedThreadId,DebugStr(), ret); return(ret); } return(t.doGet(this, _tvals)); }
/// <summary> /// Change to a computed value. /// </summary> /// <param name="fn">The function to apply to the current state and additional arguments.</param> /// <param name="args">Additional arguments.</param> /// <returns>The computed value.</returns> public object alter(IFn fn, ISeq args) { LockingTransaction t = LockingTransaction.getEx(); return(t.doSet(this, fn.applyTo(RT.cons(t.doGet(this, _tvals), args)))); }