x) Renames
This commit is contained in:
Marc Hernandez 2024-05-01 01:27:42 -07:00
parent ad4bcf31a9
commit ae4e3f75dc
2 changed files with 68 additions and 33 deletions

View File

@ -5,6 +5,7 @@ using System.Diagnostics;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -27,19 +28,19 @@ static public class Util
static public T Process<T>( ref T obj, Func<T, T> fn, string reason = "", static public T Process<T>( ref T obj, Func<T, T> fn, string reason = "",
[CallerMemberName] string dbgName = "", [CallerMemberName] string dbgName = "",
[CallerFilePath] string dbgPath = "", [CallerFilePath] string dbgPath = "",
[CallerLineNumber] int lineNumber = 0, [CallerLineNumber] int dbgLine = 0,
[CallerArgumentExpression("fn")] [CallerArgumentExpression("fn")]
string dbgExp = default ) string dbgExp = default )
where T : Recorded<T> where T : Recorded<T>
{ {
obj = obj.Process( fn, reason, dbgName, dbgPath, lineNumber, dbgExp ); obj = obj.Process( fn, reason, dbgName, dbgPath, dbgLine, dbgExp );
return obj; return obj;
} }
static public T LightProcess<T>( ref T obj, Func<T, T> fn, string reason = "", static public T LightProcess<T>( ref T obj, Func<T, T> fn, string reason = "",
[CallerMemberName] string dbgName = "", [CallerMemberName] string dbgName = "",
[CallerFilePath] string dbgPath = "", [CallerFilePath] string dbgPath = "",
[CallerLineNumber] int lineNumber = 0, [CallerLineNumber] int dbgLine = 0,
[CallerArgumentExpression("fn")] [CallerArgumentExpression("fn")]
string dbgExp = default ) string dbgExp = default )
where T : Versioned<T> where T : Versioned<T>
@ -99,9 +100,36 @@ public record class Versioned<T> : Imm
Meta Imm.Meta => MetaStorage; Meta Imm.Meta => MetaStorage;
ObjectIDGenerator oIdGen = new();
[lib.Dont] [lib.Dont]
[DebuggerBrowsable(DebuggerBrowsableState.Never)] [DebuggerBrowsable(DebuggerBrowsableState.Never)]
public ChangeDelegate OnChange = (old, cur) => {}; internal ChangeDelegate OnChange = (old, cur) => {};
public void AddOnChange( ChangeDelegate fn,
string reason,
[CallerMemberName] string dbgName = "",
[CallerFilePath] string dbgPath = "",
[CallerLineNumber] int dbgLine = 0
)
{
var oid = oIdGen.GetId( fn, out var firstTime );
log.debug( $"ADD {oid}/{firstTime} {log.whatFile(dbgPath)}({dbgLine}): {dbgName} added OnChange bcs {reason}" );
OnChange += fn;
}
public void RemOnChange( ChangeDelegate fn,
[CallerMemberName] string dbgName = "",
[CallerFilePath] string dbgPath = "",
[CallerLineNumber] int dbgLine = 0
)
{
var oid = oIdGen.GetId( fn, out var firstTime );
log.debug( $"REM {oid}/{firstTime}{log.whatFile(dbgPath)}({dbgLine}): {dbgName} removing OnChange" );
OnChange -= fn;
}
public T Process( Func<T, T> fn, string reason = "" ) public T Process( Func<T, T> fn, string reason = "" )
{ {
@ -152,29 +180,29 @@ public record class Recorded<T> : Versioned<T>
string reason = "", string reason = "",
[CallerMemberName] string dbgName = "", [CallerMemberName] string dbgName = "",
[CallerFilePath] string dbgPath = "", [CallerFilePath] string dbgPath = "",
[CallerLineNumber] int lineNumber = 0 [CallerLineNumber] int dbgLine = 0
) )
{ {
return Process( t => t, reason, dbgName, dbgPath, lineNumber ); return Process( t => t, reason, dbgName, dbgPath, dbgLine );
} }
virtual public T Process( T next, virtual public T Process( T next,
string reason = "", string reason = "",
[CallerMemberName] string dbgName = "", [CallerMemberName] string dbgName = "",
[CallerFilePath] string dbgPath = "", [CallerFilePath] string dbgPath = "",
[CallerLineNumber] int lineNumber = 0, [CallerLineNumber] int dbgLine = 0,
[CallerArgumentExpression("next")] [CallerArgumentExpression("next")]
string dbgExp = default string dbgExp = default
) )
{ {
return Process( ( old ) => next, reason, dbgName, dbgPath, lineNumber, dbgExp ); return Process( ( old ) => next, reason, dbgName, dbgPath, dbgLine, dbgExp );
} }
virtual public T Process( Func<T, T> fn, virtual public T Process( Func<T, T> fn,
string reason = "", string reason = "",
[CallerMemberName] string dbgName = "", [CallerMemberName] string dbgName = "",
[CallerFilePath] string dbgPath = "", [CallerFilePath] string dbgPath = "",
[CallerLineNumber] int lineNumber = 0, [CallerLineNumber] int dbgLine = 0,
[CallerArgumentExpression("fn")] [CallerArgumentExpression("fn")]
string dbgExp = default string dbgExp = default
) )
@ -183,6 +211,9 @@ public record class Recorded<T> : Versioned<T>
var next = fn( orig ); var next = fn( orig );
if( object.ReferenceEquals( orig, next) )
return next;
var ret = next with var ret = next with
{ {
//Do the Versioned code here //Do the Versioned code here
@ -194,7 +225,7 @@ public record class Recorded<T> : Versioned<T>
ZZOld = orig, ZZOld = orig,
MemberName = dbgName, MemberName = dbgName,
FilePath = dbgPath, FilePath = dbgPath,
LineNumber = lineNumber, LineNumber = dbgLine,
} }
}; };
@ -236,35 +267,35 @@ public record class Timed<T> : Recorded<T>
string reason = "", string reason = "",
[CallerMemberName] string dbgName = "", [CallerMemberName] string dbgName = "",
[CallerFilePath] string dbgPath = "", [CallerFilePath] string dbgPath = "",
[CallerLineNumber] int lineNumber = 0 [CallerLineNumber] int dbgLine = 0
) )
{ {
return Process( t => t, reason, dbgName, dbgPath, lineNumber ); return Process( t => t with { MetaStorage = t.Meta with { Reason = $"Record {reason}" }}, reason, dbgName, dbgPath, dbgLine );
} }
override public T Process( T next, override public T Process( T next,
string reason = "", string reason = "",
[CallerMemberName] string dbgName = "", [CallerMemberName] string dbgName = "",
[CallerFilePath] string dbgPath = "", [CallerFilePath] string dbgPath = "",
[CallerLineNumber] int lineNumber = 0, [CallerLineNumber] int dbgLine = 0,
[CallerArgumentExpression("next")] [CallerArgumentExpression("next")]
string dbgExp = default string dbgExp = default
) )
{ {
return Process( ( old ) => next, reason, dbgName, dbgPath, lineNumber, dbgExp ); return Process( ( old ) => next, reason, dbgName, dbgPath, dbgLine, dbgExp );
} }
public U ProcessFn<U>( Func<U, U> fn, public U ProcessFn<U>( Func<U, U> fn,
string reason = "", string reason = "",
[CallerMemberName] string dbgName = "", [CallerMemberName] string dbgName = "",
[CallerFilePath] string dbgPath = "", [CallerFilePath] string dbgPath = "",
[CallerLineNumber] int lineNumber = 0, [CallerLineNumber] int dbgLine = 0,
[CallerArgumentExpression("next")] [CallerArgumentExpression("next")]
string dbgExp = default string dbgExp = default
) )
where U : T where U : T
{ {
return (U)ProcessFn( fn, reason, dbgName, dbgPath, lineNumber, dbgExp ); return (U)ProcessFn( fn, reason, dbgName, dbgPath, dbgLine, dbgExp );
} }
override public T Process( Func<T, T> fn, override public T Process( Func<T, T> fn,
@ -290,6 +321,9 @@ public record class Timed<T> : Recorded<T>
var next = fn( orig ); var next = fn( orig );
if( object.ReferenceEquals( orig, next) )
return next;
var ret = next with var ret = next with
{ {
MetaStorage = Meta with MetaStorage = Meta with
@ -310,7 +344,8 @@ public record class Timed<T> : Recorded<T>
}; };
if( OnChange != null) OnChange( orig, ret ); if( OnChange != null)
OnChange( orig, ret );
return ret; return ret;
} }

View File

@ -16,38 +16,38 @@ static public class iu
//This can handle both Timed and Recorded //This can handle both Timed and Recorded
static public T Process<T>( ref T obj, Func<T, T> fn, static public T Process<T>( ref T obj, Func<T, T> fn,
string reason = "", string reason = "",
[CallerMemberName] string memberName = "", [CallerMemberName] string dbgName = "",
[CallerFilePath] string filePath = "", [CallerFilePath] string dbgPath = "",
[CallerLineNumber] int lineNumber = 0, [CallerLineNumber] int dbgLine = 0,
[CallerArgumentExpression("fn")] [CallerArgumentExpression("fn")]
string expression = default ) string dbgExpression = default )
where T : Recorded<T>, Imm where T : Recorded<T>, Imm
{ {
obj = obj.Process( fn, reason, memberName, filePath, lineNumber, expression ); obj = obj.Process( fn, reason, dbgName, dbgPath, dbgLine, dbgExpression );
return obj; return obj;
} }
static public Recorded<T> Process<T>( ref Recorded<T> obj, Func<T, T> fn, static public Timed<T> Process<T>( ref Timed<T> obj, Func<T, T> fn,
string reason = "", string reason = "",
[CallerMemberName] string memberName = "", [CallerMemberName] string dbgName = "",
[CallerFilePath] string filePath = "", [CallerFilePath] string dbgPath = "",
[CallerLineNumber] int lineNumber = 0, [CallerLineNumber] int dbgLine = 0,
[CallerArgumentExpression("fn")] [CallerArgumentExpression("fn")]
string expression = default ) string dbgExpression = default )
where T : Recorded<T>, Imm where T : Timed<T>, Imm
{ {
obj = obj.Process( fn, reason, memberName, filePath, lineNumber, expression ); obj = obj.Process( fn, reason, dbgName, dbgPath, dbgLine, dbgExpression );
return obj; return obj;
} }
static public T LightProcess<T>( ref T obj, Func<T, T> fn, static public T LightProcess<T>( ref T obj, Func<T, T> fn,
string reason = "", string reason = "",
[CallerMemberName] string memberName = "", [CallerMemberName] string dbgName = "",
[CallerFilePath] string filePath = "", [CallerFilePath] string dbgPath = "",
[CallerLineNumber] int lineNumber = 0, [CallerLineNumber] int dbgLine = 0,
[CallerArgumentExpression("fn")] [CallerArgumentExpression("fn")]
string expression = default ) string dbgExpression = default )
where T : Versioned<T>, Imm where T : Versioned<T>, Imm
{ {
obj = obj.Process( fn, reason ); obj = obj.Process( fn, reason );