Skip to content

Commit 68d6184

Browse files
committed
Cache the response to speed up future results
1 parent fd4b30e commit 68d6184

File tree

1 file changed

+35
-3
lines changed

1 file changed

+35
-3
lines changed

Sources/Tiktoken/Load.swift

+35-3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77

88
import Foundation
9+
import CryptoKit
910

1011
enum Load {
1112
static func loadTiktokenBpe(url: String, decoder: FileDecoder = FileDecoder()) async -> [[UInt8]: Int] {
@@ -56,7 +57,18 @@ enum Load {
5657
}
5758
}
5859

60+
private extension String {
61+
var sha256: String {
62+
let data = Data(self.utf8)
63+
let hashed = SHA256.hash(data: data)
64+
return hashed.compactMap { String(format: "%02x", $0) }.joined()
65+
}
66+
}
67+
5968
private extension Load {
69+
70+
private static let cacheDirectoryURL = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!
71+
6072
static var exponentialPow: Int {
6173
Int(pow(2.0, 8))
6274
}
@@ -69,10 +81,30 @@ private extension Load {
6981
array.reduce(into: [:], { $0[Character($1)] = $1 })
7082
}
7183

84+
// Fetch data
7285
static func fetch(stringUrl: String) async throws -> Data? {
73-
guard let url = URL(string: stringUrl) else { return nil }
74-
let result = try await URLSession.shared.data(from: url)
75-
return result.0
86+
let urlHash = stringUrl.sha256
87+
88+
// Create a URL for cache file
89+
let cacheFileURL = cacheDirectoryURL.appendingPathComponent("\(urlHash)")
90+
91+
// Check if the data exists in cache
92+
if FileManager.default.fileExists(atPath: cacheFileURL.path) {
93+
let data = try? Data(contentsOf: cacheFileURL)
94+
return data
95+
} else {
96+
guard let url = URL(string: stringUrl) else { return nil }
97+
let (data, _) = try await URLSession.shared.data(from: url)
98+
99+
// Save data to cache
100+
do {
101+
try data.write(to: cacheFileURL)
102+
} catch {
103+
print("Error while caching: \(error)")
104+
}
105+
106+
return data
107+
}
76108
}
77109

78110
static func getVocab(url: String) async -> [(String, String)] {

0 commit comments

Comments
 (0)