<> <> <> <> <> DIRECTORY Pipal, PipalInt, PipalReal, RefTab; PipalOps: CEDAR DEFINITIONS = BEGIN <> <> <> enumerateMethod: Pipal.Method; EachChildProc: TYPE = PROC [child: Pipal.Object] RETURNS [quit: BOOL _ FALSE]; EnumerateProc: TYPE = PROC [object: Pipal.Object, each: EachChildProc] RETURNS [quit: BOOL _ FALSE]; <> <> <<>> HasEnumerate: PROC [object: Pipal.Object] RETURNS [BOOL]; Enumerate: EnumerateProc; <> <> <<>> CountChildren: PROC [object: Pipal.Object] RETURNS [count: NAT _ 0]; NthChild: PROC [object: Pipal.Object, rank: NAT _ 0] RETURNS [nthChild: Pipal.Object _ NIL]; <> <<>> Recast: PROC [object: Pipal.Object] RETURNS [Pipal.Object]; <> <<>> HashByEnumeration: Pipal.HashProc; <> <<>> CachedHashByEnumeration: Pipal.HashProc; <> <<>> EqualByEnumeration: Pipal.EqualProc; <> <> <> <<>> Reachable: PROC [root, candidate: Pipal.Object] RETURNS [BOOL]; <> <<>> AnyReachable: PROC [root: Pipal.Object, table: RefTab.Ref] RETURNS [BOOL]; <> <<>> <> replaceMethod: Pipal.Method; MapProc: TYPE = PROC [old: Pipal.Object] RETURNS [new: Pipal.Object _ NIL]; <> <<>> ReplaceProc: TYPE = PROC [parent: Pipal.Object, map: MapProc] RETURNS [newParent: Pipal.Object]; <> <> <> <<>> Replace: ReplaceProc; <> < crash and burn. >> <> <<>> ReplaceFromRecast: ReplaceProc; <> <<>> ReplaceTable: TYPE = RefTab.Ref; <> <<>> ReplaceWithTable: PUBLIC PROC [oldRoot: Pipal.Object, table: ReplaceTable]; <> <<>> TransitiveReplace: PROC [root: Pipal.Object, table: ReplaceTable]; <> <> <> <> <> <<>> Path: TYPE = PRIVATE LIST OF PathBit; PathBit: TYPE = PRIVATE RECORD [type: PathBitType, rank: NAT]; PathBitType: TYPE = {ops, real, int}; <> <> <> ConcatPath: PROC [rootPath, childPath: Path] RETURNS [newPath: Path]; ExtendPath: PROC [currentPath: Path, type: PathBitType, rank: NAT] RETURNS [newPath: Path]; ApplyPath: PROC [root: Pipal.Object, path: Path] RETURNS [child: Pipal.Object]; ApplyRealPath: PROC [root: Pipal.Object, path: Path, transformation: PipalReal.Transformation] RETURNS [trans: PipalReal.Transformation, child: Pipal.Object]; <> ApplyIntPath: PROC [root: Pipal.Object, path: Path, transformation: PipalInt.Transformation] RETURNS [trans: PipalInt.Transformation, child: Pipal.Object]; <> <<>> ReplaceInPathWithTable: PROC [root: Pipal.Object, path: Path, table: ReplaceTable]; ReplaceInPath: PROC [root: Pipal.Object, path: Path, oldChild, newChild: Pipal.Object] RETURNS [table: ReplaceTable]; <> <> <<>> FindOpsPath: PROC [root, searched: Pipal.Object] RETURNS [path: Path, found: BOOL]; <> FindRealPath: PROC [rootTrans: PipalReal.Transformation, root: Pipal.Object, searchedTrans: PipalReal.Transformation, searched: Pipal.Object] RETURNS [path: Path, found: BOOL]; <> FindIntPath: PROC [rootTrans: PipalInt.Transformation, root: Pipal.Object, searchedTrans: PipalInt.Transformation, searched: Pipal.Object] RETURNS [path: Path, found: BOOL]; <> <> <> <<>> WatchDog: TYPE = PROC [arg1, arg2, arg3: REF _ NIL, registrationData: REF _ NIL]; <> <> <> RegisterWatchDog: PROC [event: ATOM, dog: WatchDog, registrationData: REF _ NIL]; <> <<>> ForgetWatchDog: PROC [event: ATOM, dog: WatchDog, registrationData: REF _ NIL, equal: PROC [REF, REF] RETURNS [BOOL] _ NIL]; <> <<>> Broadcast: PROC [event: ATOM, arg1, arg2, arg3: REF _ NIL]; <> <> <> <> <<>> replaceEvent: READONLY ATOM; <> <<>> ReplaceWatchDog: TYPE = PROC [root: Pipal.Object, table: ReplaceTable]; <> <> RegisterReplaceWatchDog: PROC [root: Pipal.Object, dog: ReplaceWatchDog]; <> <> <<>> ForgetReplaceWatchDog: PROC [root: Pipal.Object, dog: ReplaceWatchDog]; <> <> <<>> BroadcastReplace: PROC [table: ReplaceTable]; <> <> <> Event: TYPE = RECORD [message: Pipal.ROPE, state: REF]; Events: TYPE = LIST OF Event; UndoRedo: TYPE = RECORD [ undo: Events _ NIL, -- first undoable event head of list redo: Events _ NIL]; -- first redoable event head of list Do: PROC [old: UndoRedo, message: Pipal.ROPE, oldState: REF] RETURNS [new: UndoRedo]; <> <<>> UndoRedoOp: TYPE = PROC [old: UndoRedo, oldState: REF] RETURNS [new: UndoRedo, newState: REF]; Undo: UndoRedoOp; <> <<>> Redo: UndoRedoOp; <> <<>> Reset: UndoRedoOp; <> <<>> <> wDir: Pipal.ROPE; <> <> END.