1//
2//  RNBranchAgingDictionary.m
3//  RNBranch
4//
5//  Created by Jimmy Dee on 3/8/17.
6//  Copyright © 2017 Branch Metrics. All rights reserved.
7//
8
9#import "RNBranchAgingDictionary.h"
10#import "RNBranchAgingItem.h"
11
12@interface RNBranchAgingDictionary()
13@property (nonatomic) NSMutableDictionary *dictionary;
14@end
15
16@implementation RNBranchAgingDictionary
17
18#pragma mark - Object lifecycle
19
20+ (instancetype)dictionaryWithTtl:(NSTimeInterval)ttl
21{
22    return [[self alloc] initWithTtl:ttl];
23}
24
25- (instancetype)initWithTtl:(NSTimeInterval)ttl
26{
27    self = [super init];
28    if (self) {
29        _ttl = ttl;
30        _dictionary = [NSMutableDictionary dictionary];
31    }
32    return self;
33}
34
35- (instancetype)init
36{
37    @throw nil;
38}
39
40#pragma mark - Methods from NSMutableDictionary
41
42- (void)setObject:(id)anObject forKey:(id<NSCopying>)aKey
43{
44    [self insertItem:anObject forKey:aKey];
45}
46
47- (void)setObject:(id)obj forKeyedSubscript:(id<NSCopying>)key
48{
49    [self insertItem:obj forKey:key];
50}
51
52- (id)objectForKey:(id)aKey
53{
54    return [self itemForKey:aKey];
55}
56
57- (id)objectForKeyedSubscript:(id)key
58{
59    return [self itemForKey:key];
60}
61
62- (void)removeObjectForKey:(id)key
63{
64    [self.dictionary removeObjectForKey:key];
65}
66
67#pragma mark - Internal utilities
68
69- (void)insertItem:(id)obj forKey:(id<NSCopying>)key
70{
71    [self ageItems];
72
73    self.dictionary[key] = [[RNBranchAgingItem alloc] initWithItem:obj];
74}
75
76- (id)itemForKey:(id)key
77{
78    RNBranchAgingItem *item = self.dictionary[key];
79    return item.item;
80}
81
82- (void)ageItems
83{
84    NSTimeInterval now = [NSDate date].timeIntervalSince1970;
85
86    NSArray<NSString *> *keys = self.dictionary.allKeys; // copy of allKeys
87
88    for (NSString *key in keys) {
89        RNBranchAgingItem *item = self.dictionary[key];
90        if ((now - item.accessTime) >= self.ttl) {
91            [self.dictionary removeObjectForKey:key];
92        }
93    }
94}
95
96@end
97