⌈Listener Pattern⌋
In[]:=
BeginPackage["Listeners`"];
In[]:=
Listener::usage="Core listener object to work with";Listeners::usage="Lists the listener objects";
In[]:=
BeginPackage["`Package`"];
In[]:=
$Listeners::usage="";
In[]:=
createListener::usage="";updateListener::usage="";removeListener::usage="";getListener::usage="";
In[]:=
addListener::usage="";dropListener::usage="";
In[]:=
listenerExists::usage="";listenerObject::usage="";listenerData::usage="";
In[]:=
EndPackage[];
In[]:=
ListenerDynamic::usage="Dynamic-esque block but with a set of named listeners";
In[]:=
Begin["`Private`"];
⌈Listener cache⌋
In[]:=
⌈ Using a weak hash map so that we can store data but still have it nicely cleaned up⌋
In[]:=
IfHead@$Listeners=!=Language`ExpressionStore, $Listeners=Language`NewExpressionStore["Listeners"]; Scan[$Listeners@"remove"[#[[1]]]&,$Listeners@"listTable"[]];
⌈OOP⌋
⌈MutationHandler⌋
In[]:=
⌈ Handle listener object mutation⌋
In[]:=
listenerMutationHandler~SetAttributes~HoldAllComplete
⌈l[“Callback”] =⌋
⌈l[“Value”] =⌋
⌈l[“Value”] :=⌋
⌈l =⌋
⌈l[__] = ...⌋
⌈l[[__]] = ...⌋
⌈l =.⌋
⌈Clear@l⌋
⌈Remove@l⌋
⌈Fallback⌋
⌈Constructor⌋
⌈Value⌋
⌈Name⌋
⌈Variable⌋
⌈ID⌋
⌈Expression⌋
⌈Callback⌋
⌈Others⌋
⌈API⌋
⌈Listeners⌋
⌈listenerObject⌋
⌈listenerData⌋
⌈listenerExists⌋
⌈addListener⌋
⌈dropListener⌋
⌈Create⌋
⌈Callback⌋
⌈Update⌋
⌈Template⌋
⌈Value⌋
⌈Key⌋
⌈Part⌋
⌈Remove⌋
⌈Get⌋
⌈Name⌋
⌈Variable⌋
⌈ID⌋
⌈Expression⌋
⌈Callback⌋
⌈Formatting⌋
⌈Format⌋
⌈Dynamic⌋
⌈ListenerDynamic⌋
In[]:=
End[];
EndPackage[];
In[]:=
$HistoryLength=0;
In[]:=
<<BTools`All`
In[]:=
Block[{$Path=Prepend[$Path,NotebookDirectory[]]},<<Listeners`]
In[]:=
Get["https://github.com/b3m2a1/mathematica-tools/raw/master/Listeners.m"]
In[]:=
obj=Listener["object"];obj["Variable"]
Out[]=
Hold[Listeners`Private`listener$21210]
In[]:=
Interval[1]
Out[]=
Interval[{1,1}]
In[]:=
AssociationQ@System`Private`HoldSetValid[Association[12]]
Out[]=
True
In[]:=
Interval//DownValues
Out[]=
{}
In[]:=
mem1=MemoryInUse[];
In[]:=
obj=RandomReal[{-1,1},{100,100,100}];mem2=MemoryInUse[];mem2-mem1
Out[]=
8000368
In[]:=
OwnValues[obj]={};mem3=MemoryInUse[];mem3-mem1
Out[]=
-1128
In[]:=
Listeners`Private`listener$21210
Out[]=
Listeners`Private`listener$21210
In[]:=
mem4=MemoryInUse[];
In[]:=
mem4-mem1
Out[]=
29984
In[]:=
var=Listener["b"];var//InputForm
Out[]//InputForm=
Listener[b]
In[]:=
displayedForm[expr_]:=First@FrontEndExecute@ExportPacket[Cell[BoxData@ToBoxes@expr],"PlainText"]
In[]:=
displayedForm@var
Out[]=
Null
In[]:=
var=1;displayedForm@var
Out[]=
1
In[]:=
OwnValues@var//InputForm
Out[]//InputForm=
{HoldPattern[var] :> Listener[b]}