diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2021-09-02 12:10:14 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-02 12:10:14 +0200 |
commit | e0ef859130f429df1891e31a85955daa753346b4 (patch) | |
tree | 49c680c4e93a321a319e38168dd14483c2a9b71e /lib/pure/algorithm.nim | |
parent | 72fa5833adac590e3c78e2b774cd33f28827594b (diff) | |
download | Nim-e0ef859130f429df1891e31a85955daa753346b4.tar.gz |
strict effects (#18777)
* fixes #17369 * megatest is green for --cpu:arm64 * docgen output includes more tags/raises * implemented 'effectsOf' * algorithm.nim: uses new effectsOf annotation * closes #18376 * closes #17475 * closes #13905 * allow effectsOf: [a, b] * added a test case * parameters that are not ours cannot be declared as .effectsOf * documentation * manual: adiscard """ disabled: true """ import events type TProperty*[T] = object of TObject getProc: proc(property: TProperty[T]): T {.nimcall.} setProc: proc(property: var TProperty[T], value: T) {.nimcall.} value: T ValueChanged*: TEventHandler Binders: seq[TProperty[T]] EEmitter: TEventEmitter # Not a descriptive name but it was that or TPropertyValueChangeEventArgs. TValueEventArgs[T] = object of TEventArgs Property*: TProperty[T] proc newProperty*[T](value: T): TProperty[T] = var prop: TProperty[T] prop.EEmitter = initEventEmitter() prop.Binders = @[] prop.ValueChanged = initEventHandler("ValueChanged") prop.value = value proc getter(property: TProperty[T]): T = return property.value prop.getProc = getter proc setter(property: var TProperty[T], v: T) = property.value = v # fire event here var args: TValueEventArgs[T] args.Property = property property.EEmitter.emit(property.ValueChanged, args) prop.setProc = setter return prop proc `prop`[T] (p: TProperty[T]): T = # I'm assuming this is trying to get a value from the property. # i.e. myVar = myProperty return p.getProc(p) proc `~=`[T] (p: var TProperty[T], v: T) = # Assuming this is setting the value. p.setProc(p, v) proc `$`[T] (p: TProperty[T]): string = var value = p.getProc(p) return $value proc propertyBind*[T](p1: var TProperty[T], p2: var TProperty[T]) = p1.Binders.add(p2) # make handler -> handler[T] so trigger even more generics bugs ... proc handler(e: TEventArgs) = type TEA = TValueEventArgs[T] var args = TEA(e) var val = args.Property.getProc(p1) for i in countup(0, len(e.Property.ValueChanged.Binders) -1): var binded = e.Property.ValueChanged.Binders[i] binded.setProc(binded, val) echo("Property 1 has changed to " & $val) if p1.ValueChanged.containsHandler(handler) == false: addHandler(p1.ValueChanged, handler) proc `->`[T](p1: var TProperty[T], p2: var TProperty[T]) = propertyBind(p2,p1) when true: # Initial value testing var myProp = newProperty(5) echo(myProp) myProp ~= 7 # Temp operator until overloading of '=' is implemented. echo(myProp) # Binding testing var prop1 = newProperty(9) var prop2: TProperty[int] prop2 -> prop1 # Binds prop2 to prop1 prop1 ~= 7 echo(prop2) # Output: 7