in iep/programs.py [0:0]
def is_chain(program_list):
visited = [False for fn in program_list]
cur_idx = len(program_list) - 1
while True:
visited[cur_idx] = True
inputs = program_list[cur_idx]['inputs']
if len(inputs) == 0:
break
elif len(inputs) == 1:
cur_idx = inputs[0]
elif len(inputs) > 1:
return False
return all(visited)