From 0b254c4446482aba098884790ac2e2e8c8b7fc26 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Tue, 23 Aug 2022 00:13:11 +0100
Subject: [PATCH] Add Stored utility

---
 Sources/XXMessengerClient/Utils/Stored.swift  | 41 +++++++++++++++++++
 .../Messenger/Utils/StoredTests.swift         | 18 ++++++++
 2 files changed, 59 insertions(+)
 create mode 100644 Sources/XXMessengerClient/Utils/Stored.swift
 create mode 100644 Tests/XXMessengerClientTests/Messenger/Utils/StoredTests.swift

diff --git a/Sources/XXMessengerClient/Utils/Stored.swift b/Sources/XXMessengerClient/Utils/Stored.swift
new file mode 100644
index 00000000..56b5e97e
--- /dev/null
+++ b/Sources/XXMessengerClient/Utils/Stored.swift
@@ -0,0 +1,41 @@
+import XCTestDynamicOverlay
+
+public struct Stored<Value> {
+  public var get: () -> Value
+  public var set: (Value) -> Void
+
+  public func callAsFunction() -> Value {
+    get()
+  }
+}
+
+extension Stored {
+  public static func inMemory(_ value: Value) -> Stored<Value> {
+    let memory = Memory(value)
+    return Stored(
+      get: { memory.value },
+      set: { memory.value = $0 }
+    )
+  }
+
+  public static func inMemory<V>() -> Stored<Optional<V>> where Value == Optional<V> {
+    inMemory(nil)
+  }
+}
+
+private final class Memory<Value> {
+  init(_ value: Value) {
+    self.value = value
+  }
+
+  var value: Value
+}
+
+extension Stored {
+  public static func unimplemented() -> Stored<Value> {
+    Stored<Value>(
+      get: XCTUnimplemented("\(Self.self).get"),
+      set: XCTUnimplemented("\(Self.self).set")
+    )
+  }
+}
diff --git a/Tests/XXMessengerClientTests/Messenger/Utils/StoredTests.swift b/Tests/XXMessengerClientTests/Messenger/Utils/StoredTests.swift
new file mode 100644
index 00000000..154f6196
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Utils/StoredTests.swift
@@ -0,0 +1,18 @@
+import XCTest
+@testable import XXMessengerClient
+
+final class StoredTests: XCTestCase {
+  func testInMemory() throws {
+    let stored: Stored<String?> = .inMemory()
+
+    XCTAssertNil(stored())
+
+    stored.set("test")
+
+    XCTAssertEqual(stored(), "test")
+
+    stored.set(nil)
+
+    XCTAssertNil(stored())
+  }
+}
-- 
GitLab