From 8c0c50499702b4e85001d2106b3ba57c933faff4 Mon Sep 17 00:00:00 2001
From: Gav <gavin@parity.io>
Date: Wed, 7 Mar 2018 19:36:13 +0100
Subject: [PATCH] Use a struct!

---
 substrate/demo/runtime/src/runtime/staking.rs | 57 ++++++++++++-------
 1 file changed, 35 insertions(+), 22 deletions(-)

diff --git a/substrate/demo/runtime/src/runtime/staking.rs b/substrate/demo/runtime/src/runtime/staking.rs
index ad782c22d17..e97a9830b4c 100644
--- a/substrate/demo/runtime/src/runtime/staking.rs
+++ b/substrate/demo/runtime/src/runtime/staking.rs
@@ -141,7 +141,20 @@ pub fn total_stake() -> Balance {
 pub mod public {
 	use super::*;
 
-	type State = BTreeMap<AccountId, (Option<Balance>, Option<Vec<u8>>, BTreeMap<Vec<u8>, Option<Vec<u8>>>)>;
+	#[derive(Default)]
+	struct ChangeEntry {
+		balance: Option<Balance>,
+		code: Option<Vec<u8>>,
+		storage: BTreeMap<Vec<u8>, Option<Vec<u8>>>,
+	}
+
+	impl ChangeEntry {
+		pub fn balance_changed(b: Balance) -> Self {
+			ChangeEntry { balance: Some(b), code: None, storage: Default::default() }
+		}
+	}
+
+	type State = BTreeMap<AccountId, ChangeEntry>;
 
 	trait Externalities {
 		fn get_storage(&self, account: &AccountId, location: &[u8]) -> Option<Vec<u8>>;
@@ -191,15 +204,15 @@ pub mod public {
 	}
 
 	fn commit_state(s: State) {
-		for (address, (maybe_balance, maybe_code, storage)) in s.into_iter() {
-			if let Some(balance) = maybe_balance {
+		for (address, changed) in s.into_iter() {
+			if let Some(balance) = changed.balance {
 				storage::put(&address.to_keyed_vec(BALANCE_OF), &balance);
 			}
-			if let Some(code) = maybe_code {
+			if let Some(code) = changed.code {
 				storage::put(&address.to_keyed_vec(CODE_OF), &code);
 			}
 			let storage_key = address.to_keyed_vec(STORAGE_OF);
-			for (k, v) in storage.into_iter() {
+			for (k, v) in changed.storage.into_iter() {
 				let mut key = storage_key.clone();
 				key.extend(k);
 				if let Some(value) = v {
@@ -212,20 +225,20 @@ pub mod public {
 	}
 
 	fn merge_state(commit_state: State, local: &mut State) {
-		for (address, (maybe_balance, maybe_code, storage)) in commit_state.into_iter() {
+		for (address, changed) in commit_state.into_iter() {
 			match local.entry(address) {
 				Entry::Occupied(e) => {
 					let mut value = e.into_mut();
-					if maybe_balance.is_some() {
-						value.0 = maybe_balance;
+					if changed.balance.is_some() {
+						value.balance = changed.balance;
 					}
-					if maybe_code.is_some() {
-						value.1 = maybe_code;
+					if changed.code.is_some() {
+						value.code = changed.code;
 					}
-					value.2.extend(storage.into_iter());
+					value.storage.extend(changed.storage.into_iter());
 				}
 				Entry::Vacant(e) => {
-					e.insert((maybe_balance, maybe_code, storage));
+					e.insert(changed);
 				}
 			}
 		}
@@ -262,8 +275,8 @@ pub mod public {
 
 		// two inserts are safe
 		assert!(&dest != transactor);
-		local.insert(dest, (Some(value), Some(code.to_vec()), Default::default()));
-		local.insert(transactor.clone(), (Some(from_balance - value), None, Default::default()));
+		local.insert(dest, ChangeEntry { balance: Some(value), code: Some(code.to_vec()), storage: Default::default() });
+		local.insert(transactor.clone(), ChangeEntry::balance_changed(from_balance - value));
 
 		Some(local)
 	}
@@ -298,8 +311,8 @@ pub mod public {
 
 		if transactor != dest {
 			let mut local = local.borrow_mut();
-			local.insert(transactor.clone(), (Some(from_balance - value), None, Default::default()));
-			local.insert(dest.clone(), (Some(to_balance + value), None, Default::default()));
+			local.insert(transactor.clone(), ChangeEntry::balance_changed(from_balance - value));
+			local.insert(dest.clone(), ChangeEntry::balance_changed(to_balance + value));
 		}
 
 		let should_commit = {
@@ -307,16 +320,16 @@ pub mod public {
 			let ext = || Ext {
 				do_get_storage: |account: &AccountId, location: &[u8]|
 					local.borrow().get(account)
-						.and_then(|a| a.2.get(location))
+						.and_then(|a| a.storage.get(location))
 						.cloned()
 						.unwrap_or_else(|| ext.get_storage(account, location)),
 				do_get_code: |account: &AccountId|
 					local.borrow().get(account)
-						.and_then(|a| a.1.clone())
+						.and_then(|a| a.code.clone())
 						.unwrap_or_else(|| ext.get_code(account)),
 				do_get_balance: |account: &AccountId|
 					local.borrow().get(account)
-						.and_then(|a| a.0)
+						.and_then(|a| a.balance)
 						.unwrap_or_else(|| ext.get_balance(account)),
 			};
 			let mut transfer = |inner_dest: &AccountId, value: Balance| {
@@ -332,8 +345,8 @@ pub mod public {
 			let mut put_storage = |location: Vec<u8>, value: Option<Vec<u8>>| {
 				local.borrow_mut()
 					.entry(dest.clone())
-					.or_insert((None, None, Default::default()))
-					.2.insert(location, value);
+					.or_insert(Default::default())
+					.storage.insert(location, value);
 			};
 
 			// TODO: logging (logs are just appended into a notable storage-based vector and cleared every
@@ -518,7 +531,7 @@ fn new_era() {
 	);
 }
 
-#[cfg(any(feature = "std", test))] 
+#[cfg(any(feature = "std", test))]
 pub mod testing {
 	use super::*;
 	use runtime_io::{twox_128, TestExternalities};
-- 
GitLab