6
6
//
7
7
8
8
import Foundation
9
+ import CryptoKit
9
10
10
11
enum Load {
11
12
static func loadTiktokenBpe( url: String , decoder: FileDecoder = FileDecoder ( ) ) async -> [ [ UInt8 ] : Int ] {
@@ -56,7 +57,18 @@ enum Load {
56
57
}
57
58
}
58
59
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
+
59
68
private extension Load {
69
+
70
+ private static let cacheDirectoryURL = FileManager . default. urls ( for: . cachesDirectory, in: . userDomainMask) . first!
71
+
60
72
static var exponentialPow : Int {
61
73
Int ( pow ( 2.0 , 8 ) )
62
74
}
@@ -69,10 +81,30 @@ private extension Load {
69
81
array. reduce ( into: [ : ] , { $0 [ Character ( $1) ] = $1 } )
70
82
}
71
83
84
+ // Fetch data
72
85
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
+ }
76
108
}
77
109
78
110
static func getVocab( url: String ) async -> [ ( String , String ) ] {
0 commit comments