anchor.diff:              Open =:= Required;
           _ ->
               false
  -    end.+    end.
  
positive.code:                          end, State, LeavingNodes),
  
      %% Compute joining list.
      JoiningNodes = lists:filter(fun(N) ->
                                          not lists:member(N, CurrentMembership)
                                  end, Nodes),
      % lager:info("JoiningNodes: ~p", [JoiningNodes]),
  
      %% Issue joins.
      State2 = lists:foldl(fun(N, S) ->
                                   internal_join(N, S)
                           end, State1, JoiningNodes),
  
      {reply, ok, State2};
  
  handle_call({leave, Node}, From, State0) ->
      %% Perform leave.
  
negative.code:     CurrentMembership = [N || #{name := N} <- sets:to_list(?SET:query(Membership))],
      % lager:info("CurrentMembership: ~p", [CurrentMembership]),
  
      %% need to support Nodes as a list of maps or atoms
      %% TODO: require each node to be a map
      NodesNames = lists:map(fun(#{name := N}) ->
                                     N;
                                (N) when is_atom(N) ->
                                     N
                             end, Nodes),
  
      %% Compute leaving list.
      LeavingNodes = lists:filter(fun(N) ->
                                          not lists:member(N, NodesNames)
                                  end, CurrentMembership),
      % lager:info("LeavingNodes: ~p", [LeavingNodes]),
  
  