## Nim-LibP2P ## Copyright (c) 2019 Status Research & Development GmbH ## Licensed under either of ## * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE)) ## * MIT license ([LICENSE-MIT](LICENSE-MIT)) ## at your option. ## This file may not be copied, modified, or distributed except according to ## those terms. import tables, sequtils, sets import pubsubpeer type PeerTable* = Table[string, HashSet[PubSubPeer]] proc hasPeerID*(t: PeerTable, topic, peerId: string): bool = # unefficient but used only in tests! let peers = toSeq(t.getOrDefault(topic)) peers.any do (peer: PubSubPeer) -> bool: peer.id == peerId func addPeer*(table: var PeerTable, topic: string, peer: PubSubPeer): bool = # returns true if the peer was added, false if it was already in the collection not table.mgetOrPut(topic, initHashSet[PubSubPeer]()).containsOrIncl(peer) func removePeer*(table: var PeerTable, topic: string, peer: PubSubPeer) = table.withValue(topic, peers): peers[].excl(peer) if peers[].len == 0: table.del(topic) func hasPeer*(table: PeerTable, topic: string, peer: PubSubPeer): bool = (topic in table) and (peer in table[topic]) func peers*(table: PeerTable, topic: string): int = if topic in table: table[topic].len else: 0 func getPeers*(table: Table[string, HashSet[string]], topic: string): HashSet[string] = table.getOrDefault(topic, initHashSet[string]())