This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/Logtalk/library/subject.lgt

66 lines
1.6 KiB
Plaintext
Raw Normal View History

:- category(subject).
:- info([
version is 1.0,
author is 'Paulo Moura',
date is 03/02/09,
comment is 'Smalltalk dependent handling predicates.']).
:- public(changed/0).
:- mode(changed, one).
:- info(changed/0,
[comment is 'Receiver changed in some way. Notify all dependents.']).
:- public(changed/1).
:- mode(changed(?nonvar), one).
:- info(changed/1,
[comment is 'Receiver changed as specified in the argument. Notify all dependents.',
argnames is ['Change']]).
:- public(dependents/1).
:- mode(dependents(-list), one).
:- info(dependents/1,
[comment is 'Returns a list of all dependent objects.',
argnames is ['Dependents']]).
:- private(dependent_/1).
:- dynamic(dependent_/1).
:- mode(dependent_(?object), zero_or_more).
:- info(dependent_/1,
[comment is 'Dependent object table.',
argnames is ['Dependent']]).
:- public(addDependent/1).
:- mode(addDependent(@object), one).
:- info(addDependent/1,
[comment is 'Adds a new dependent object.',
argnames is ['Dependent']]).
:- public(removeDependent/1).
:- mode(removeDependent(?object), zero_or_more).
:- info(removeDependent/1,
[comment is 'Removes a dependent object.',
argnames is ['Dependent']]).
changed :-
self(Self),
forall(::dependent_(Dependent), Dependent::update(Self)).
changed(Change) :-
forall(::dependent_(Dependent), Dependent::update(Change)).
dependents(Dependents) :-
findall(Dependent, ::dependent_(Dependent), Dependents).
addDependent(Dependent) :-
::dependent_(Dependent) ->
true
;
::asserta(dependent_(Dependent)).
removeDependent(Dependent) :-
::retract(dependent_(Dependent)).
:- end_category.