import ceylon.language.impl{
    BaseIterator, 
    BaseIterable,
    reach
}

class ReferencesImpl(instance) extends BaseIterable<ReachableReference->Anything, Null>() 
        satisfies References&Identifiable {
    shared actual Anything instance;
    
    shared actual Iterator<ReachableReference->Anything> iterator() {
        if (exists instance) {
            return object extends BaseIterator<ReachableReference->Anything>() 
                    satisfies Identifiable {
                Iterator<ReachableReference> it = outer.references.iterator();
                
                shared actual <ReachableReference->Anything>|Finished next() {
                    ReachableReference|Finished next = it.next();
                    if (is Finished next) {
                        return finished;
                    } else {
                        return next->next.referred(instance);
                    }
                }
            };
        } else {
            return emptyIterator;
        }
    }
    
    shared actual Iterable<ReachableReference/*<Instance>*/> references {
        return object extends BaseIterable<ReachableReference, Null>() 
                satisfies Identifiable {
            shared actual Iterator<ReachableReference> iterator() {
                return reach.references(instance);
            }
        };
    }
}