cx_leaderboard v0.1.0 CxLeaderboard.Storage behaviour View Source
Use this behaviour to implement your own leaderboard storage engines.
Link to this section Summary
Callbacks
Add a single entry to the leaderboard. Return an error if the entry is already in the leaderboard. The operation should be blocking
Atomically insert an entry, or update it if its id already exists in the leaderboard
Replace all data in the leaderboard with the data in the provided stream. Return immediately, perform most of the work asynchronously
Return a correctly ordered stream of bottom leaderboard records that can be accessed all the way to the top
Clear all the data in your leaderboard state
Show the number of records in the leaderboard
Create a leaderboard in your storage (keyword arguments are determined by storage needs). Return what needs to be persisted
Return a leaderboard record by its id. Return nil if not found
Return a list of records around the given id. The list should go from top to bottom if the range is increasing, and from bottom to top if range decreasing. Zero always corresponds to where the id is positioned
If supporting server/client mode: add a way to fetch the leaderboard stored in your GenServer’s state
Replace all data in the leaderboard with the data in the provided stream. Block until completed
Remove a single entry from the leaderboard based on its id. Return an error if the id does not exist. The operation should be blocking
If supporting server/client mode: add a way to start the server and make sure to store the leaderboard struct in the state, since it will be needed for get_lb
Return a correctly ordered stream of top leaderboard records that can be accessed all the way to the bottom
Update a single entry in the leaderboard. Return an error if the entry is not found in the leaderboard. The operation should be blocking
Link to this section Callbacks
add( CxLeaderboard.Leaderboard.state(), CxLeaderboard.Entry.t(), CxLeaderboard.Indexer.t() ) :: {:ok, CxLeaderboard.Leaderboard.state()} | {:error, term()}
Add a single entry to the leaderboard. Return an error if the entry is already in the leaderboard. The operation should be blocking.
add_or_update( CxLeaderboard.Leaderboard.state(), CxLeaderboard.Entry.t(), CxLeaderboard.Indexer.t() ) :: {:ok, CxLeaderboard.Leaderboard.state()} | {:error, term()}
Atomically insert an entry, or update it if its id already exists in the leaderboard.
async_populate( CxLeaderboard.Leaderboard.state(), Enumerable.t(), CxLeaderboard.Indexer.t() ) :: {:ok, term()} | {:error, term()}
Replace all data in the leaderboard with the data in the provided stream. Return immediately, perform most of the work asynchronously.
bottom(CxLeaderboard.Leaderboard.state()) :: Enumerable.t()
Return a correctly ordered stream of bottom leaderboard records that can be accessed all the way to the top.
clear(CxLeaderboard.Leaderboard.state()) :: {:ok, CxLeaderboard.Leaderboard.state()} | {:error, term()}
Clear all the data in your leaderboard state.
count(CxLeaderboard.Leaderboard.state()) :: non_neg_integer()
Show the number of records in the leaderboard.
create(keyword()) :: {:ok, CxLeaderboard.Leaderboard.state()} | {:error, term()}
Create a leaderboard in your storage (keyword arguments are determined by storage needs). Return what needs to be persisted.
get(CxLeaderboard.Leaderboard.state(), CxLeaderboard.Entry.id()) :: CxLeaderboard.Record.t() | nil
Return a leaderboard record by its id. Return nil if not found.
get(CxLeaderboard.Leaderboard.state(), CxLeaderboard.Entry.id(), Range.t()) :: [ CxLeaderboard.Record.t() ]
Return a list of records around the given id. The list should go from top to bottom if the range is increasing, and from bottom to top if range decreasing. Zero always corresponds to where the id is positioned.
For example:
- A range -2..1 should return (from top to bottom) 2 records prior to the given id, the record at the given id, and 1 record after the given id.
- A range 2..-2 should return (from bottom to top) 2 records after the given id, the record at the given id, and 2 records before the given id.
get_lb(atom()) :: CxLeaderboard.Leaderboard.t()
If supporting server/client mode: add a way to fetch the leaderboard stored in your GenServer’s state.
populate( CxLeaderboard.Leaderboard.state(), Enumerable.t(), CxLeaderboard.Indexer.t() ) :: {:ok, CxLeaderboard.Leaderboard.state()} | {:error, term()}
Replace all data in the leaderboard with the data in the provided stream. Block until completed.
remove( CxLeaderboard.Leaderboard.state(), CxLeaderboard.Entry.id(), CxLeaderboard.Indexer.t() ) :: {:ok, CxLeaderboard.Leaderboard.state()} | {:error, term()}
Remove a single entry from the leaderboard based on its id. Return an error if the id does not exist. The operation should be blocking.
start_link(CxLeaderboard.Leaderboard.t()) :: GenServer.on_start()
If supporting server/client mode: add a way to start the server and make sure to store the leaderboard struct in the state, since it will be needed for get_lb.
top(CxLeaderboard.Leaderboard.state()) :: Enumerable.t()
Return a correctly ordered stream of top leaderboard records that can be accessed all the way to the bottom.
update( CxLeaderboard.Leaderboard.state(), CxLeaderboard.Entry.t(), CxLeaderboard.Indexer.t() ) :: {:ok, CxLeaderboard.Leaderboard.state()} | {:error, term()}
Update a single entry in the leaderboard. Return an error if the entry is not found in the leaderboard. The operation should be blocking.