-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
cf69883
commit 627cad0
Showing
20 changed files
with
502 additions
and
94 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
package org.core.eco.account; | ||
|
||
import org.core.TranslateCore; | ||
import org.core.eco.Currency; | ||
import org.core.eco.transaction.*; | ||
import org.core.eco.transaction.pending.PendingTransaction; | ||
import org.core.source.Source; | ||
import org.jetbrains.annotations.NotNull; | ||
|
||
import java.math.BigDecimal; | ||
import java.util.List; | ||
import java.util.function.BiFunction; | ||
|
||
public interface Account extends Source { | ||
|
||
@NotNull String getName(); | ||
|
||
@NotNull PendingTransaction transact(@NotNull Transaction transaction); | ||
|
||
default @NotNull PendingTransaction transact(@NotNull Account other, | ||
BiFunction<AccountSnapshot, AccountSnapshot, List<Transaction>> transactions) { | ||
return new SecureTransaction(this, other, transactions).run(); | ||
} | ||
|
||
@NotNull BigDecimal getBalance(@NotNull Currency currency); | ||
|
||
default @NotNull BigDecimal getBalance() { | ||
return this.getBalance(TranslateCore.getCurrencyManager().getDefaultCurrency()); | ||
} | ||
|
||
default PendingTransaction deposit(@NotNull Currency currency, @NotNull Number amount) { | ||
return this.transact(new DepositTransaction(this, currency, | ||
amount instanceof BigDecimal ? (BigDecimal) amount : BigDecimal.valueOf( | ||
amount.doubleValue()))); | ||
} | ||
|
||
default PendingTransaction withdraw(@NotNull Currency currency, @NotNull Number amount) { | ||
return this.transact(new WithdrawTransaction(this, currency, | ||
amount instanceof BigDecimal ? (BigDecimal) amount : BigDecimal.valueOf( | ||
amount.doubleValue()))); | ||
} | ||
|
||
default PendingTransaction setBalance(@NotNull Currency currency, @NotNull Number amount) { | ||
return this.transact(new SetTransaction(this, currency, | ||
amount instanceof BigDecimal ? (BigDecimal) amount : BigDecimal.valueOf( | ||
amount.doubleValue()))); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
package org.core.eco.account; | ||
|
||
import org.core.eco.Currency; | ||
import org.core.eco.transaction.Transaction; | ||
import org.core.eco.transaction.pending.PendingSingleTransactionImpl; | ||
import org.core.eco.transaction.pending.PendingTransaction; | ||
import org.jetbrains.annotations.NotNull; | ||
|
||
import java.math.BigDecimal; | ||
import java.util.HashMap; | ||
import java.util.Map; | ||
import java.util.concurrent.CompletableFuture; | ||
|
||
public class AccountSnapshot implements Account { | ||
|
||
private final Account account; | ||
private Map<Currency, BigDecimal> cachedAmount = new HashMap<>(); | ||
|
||
public AccountSnapshot(Account account) { | ||
this.account = account; | ||
} | ||
|
||
@Override | ||
public @NotNull String getName() { | ||
return this.account.getName(); | ||
} | ||
|
||
@Override | ||
public @NotNull PendingTransaction transact(@NotNull Transaction transaction) { | ||
switch (transaction.getType()) { | ||
case DEPOSIT -> { | ||
BigDecimal current = cachedAmount.get(transaction.getCurrency()); | ||
if(current == null){ | ||
current = account.getBalance(transaction.getCurrency()); | ||
} | ||
cachedAmount.put(transaction.getCurrency(), current.add(transaction.getAmount())); | ||
return new PendingSingleTransactionImpl(this, transaction, CompletableFuture.completedFuture()); | ||
} | ||
case WITHDRAW -> { | ||
} | ||
case SET -> { | ||
} | ||
} | ||
return null; | ||
} | ||
|
||
@Override | ||
public @NotNull BigDecimal getBalance(@NotNull Currency currency) { | ||
BigDecimal amount = this.cachedAmount.get(currency); | ||
if (amount != null) { | ||
return amount; | ||
} | ||
amount = this.account.getBalance(currency); | ||
this.cachedAmount.put(currency, amount); | ||
return amount; | ||
} | ||
} |
2 changes: 1 addition & 1 deletion
2
...ava/org/core/source/eco/NamedAccount.java → ...va/org/core/eco/account/NamedAccount.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
package org.core.source.eco; | ||
package org.core.eco.account; | ||
|
||
public interface NamedAccount extends Account { | ||
|
||
|
3 changes: 1 addition & 2 deletions
3
...va/org/core/source/eco/PlayerAccount.java → ...a/org/core/eco/account/PlayerAccount.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
27 changes: 27 additions & 0 deletions
27
src/main/java/org/core/eco/transaction/AbstractTransaction.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
package org.core.eco.transaction; | ||
|
||
import org.core.eco.Currency; | ||
import org.jetbrains.annotations.NotNull; | ||
|
||
import java.math.BigDecimal; | ||
|
||
class AbstractTransaction implements Transaction { | ||
|
||
private final Currency currency; | ||
private final BigDecimal amount; | ||
|
||
AbstractTransaction(Currency currency, BigDecimal amount) { | ||
this.amount = amount; | ||
this.currency = currency; | ||
} | ||
|
||
@Override | ||
public @NotNull Currency getCurrency() { | ||
return this.currency; | ||
} | ||
|
||
@Override | ||
public @NotNull BigDecimal getAmount() { | ||
return this.amount; | ||
} | ||
} |
26 changes: 26 additions & 0 deletions
26
src/main/java/org/core/eco/transaction/SecureTransaction.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
package org.core.eco.transaction; | ||
|
||
import org.core.eco.account.Account; | ||
import org.core.eco.transaction.pending.PendingTransaction; | ||
|
||
import java.util.Collection; | ||
import java.util.function.BiFunction; | ||
|
||
public class SecureTransaction { | ||
|
||
private Account target; | ||
private Account other; | ||
private BiFunction<Account, Account, Collection<PendingTransaction>> transactions; | ||
|
||
public SecureTransaction(Account target, | ||
Account other, | ||
BiFunction<Account, Account, Collection<PendingTransaction>> transactions) { | ||
this.target = target; | ||
this.other = other; | ||
this.transactions = transactions; | ||
} | ||
|
||
public PendingTransaction run() { | ||
|
||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
package org.core.eco.transaction; | ||
|
||
import org.core.eco.Currency; | ||
import org.jetbrains.annotations.NotNull; | ||
|
||
import java.math.BigDecimal; | ||
|
||
public interface Transaction { | ||
|
||
@NotNull Currency getCurrency(); | ||
|
||
@NotNull BigDecimal getAmount(); | ||
|
||
@NotNull TransactionType getType(); | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
package org.core.eco.transaction; | ||
|
||
public enum TransactionType { | ||
|
||
DEPOSIT, | ||
WITHDRAW, | ||
SET | ||
} |
21 changes: 21 additions & 0 deletions
21
src/main/java/org/core/eco/transaction/pending/PendingSingleTransaction.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
package org.core.eco.transaction.pending; | ||
|
||
import org.core.eco.transaction.Transaction; | ||
import org.jetbrains.annotations.NotNull; | ||
|
||
import java.util.Collections; | ||
import java.util.List; | ||
|
||
public interface PendingSingleTransaction extends PendingTransaction { | ||
|
||
@NotNull Transaction getTransaction(); | ||
|
||
@Override | ||
@Deprecated | ||
default @NotNull List<Transaction> getRemainingTransactions() { | ||
if (this.isComplete()) { | ||
return Collections.emptyList(); | ||
} | ||
return Collections.singletonList(this.getTransaction()); | ||
} | ||
} |
62 changes: 62 additions & 0 deletions
62
src/main/java/org/core/eco/transaction/pending/PendingSingleTransactionImpl.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
package org.core.eco.transaction.pending; | ||
|
||
import org.core.eco.account.Account; | ||
import org.core.eco.transaction.Transaction; | ||
import org.core.eco.transaction.result.TransactionResult; | ||
import org.core.eco.transaction.result.TransactionsResult; | ||
import org.core.eco.transaction.result.impl.TransactionsResultImpl; | ||
import org.jetbrains.annotations.NotNull; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
import java.util.concurrent.CompletableFuture; | ||
|
||
public class PendingSingleTransactionImpl implements PendingSingleTransaction { | ||
|
||
private final Account account; | ||
private final Transaction transaction; | ||
private final List<TransactionResult> result = new ArrayList<>(); | ||
private final CompletableFuture<TransactionResult> future; | ||
|
||
public PendingSingleTransactionImpl(Account account, | ||
Transaction transaction, | ||
CompletableFuture<TransactionResult> future) { | ||
this.future = future.thenApply(result -> { | ||
this.result.add(result); | ||
return result; | ||
}); | ||
this.transaction = transaction; | ||
this.account = account; | ||
} | ||
|
||
|
||
@Override | ||
public @NotNull Transaction getTransaction() { | ||
return this.transaction; | ||
} | ||
|
||
@Override | ||
public @NotNull Account getTarget() { | ||
return this.account; | ||
} | ||
|
||
@Override | ||
public @NotNull TransactionsResult getCurrentResult() { | ||
return new TransactionsResultImpl(this.result); | ||
} | ||
|
||
@Override | ||
public @NotNull CompletableFuture<TransactionResult> awaitCurrentTransaction() { | ||
return this.future; | ||
} | ||
|
||
@Override | ||
public @NotNull CompletableFuture<TransactionsResult> awaitComplete() { | ||
return this.awaitCurrentTransaction().thenApply(t -> this.getCurrentResult()); | ||
} | ||
|
||
@Override | ||
public boolean isComplete() { | ||
return !this.result.isEmpty(); | ||
} | ||
} |
37 changes: 37 additions & 0 deletions
37
src/main/java/org/core/eco/transaction/pending/PendingTransaction.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
package org.core.eco.transaction.pending; | ||
|
||
import org.core.eco.account.Account; | ||
import org.core.eco.transaction.Transaction; | ||
import org.core.eco.transaction.result.TransactionResult; | ||
import org.core.eco.transaction.result.TransactionsResult; | ||
import org.jetbrains.annotations.NotNull; | ||
|
||
import java.util.List; | ||
import java.util.Optional; | ||
import java.util.concurrent.CompletableFuture; | ||
|
||
public interface PendingTransaction { | ||
|
||
@NotNull List<Transaction> getRemainingTransactions(); | ||
|
||
@NotNull Account getTarget(); | ||
|
||
@NotNull TransactionsResult getCurrentResult(); | ||
|
||
@NotNull CompletableFuture<TransactionResult> awaitCurrentTransaction(); | ||
|
||
@NotNull CompletableFuture<TransactionsResult> awaitComplete(); | ||
|
||
boolean isComplete(); | ||
|
||
default Optional<Transaction> getCurrentTransaction() { | ||
List<Transaction> remaining = this.getRemainingTransactions(); | ||
if (remaining.isEmpty()) { | ||
return Optional.empty(); | ||
} | ||
return Optional.of(remaining.get(0)); | ||
} | ||
|
||
; | ||
|
||
} |
Oops, something went wrong.