Untitled

 avatar
unknown
javascript
a year ago
1.9 kB
6
Indexable
class KVStore {
    constructor() {
        this.lookupMap = {}
        this.transaction = []
    }
    
    get(key) {
        const len = this.transaction.length
         if(len){
             // search through all transaction
             const valueInTransaction = this.transaction.findLast((tran) => {
                return tran[key] ?? {}
             })

             if(valueInTransaction && !valueInTransaction[key]) {
                 return `can't find key: ${key} in current transaction`
             }

            return valueInTransaction ? valueInTransaction[key] : this.lookupMap[key] ? this.lookupMap[key] : `can't find key: ${key} in current transaction`
        }else {
            return this.lookupMap[key] ? this.lookupMap[key] : `can't find key: ${key}`
        }
        
    }
    
    set(key, value) {
        const len = this.transaction.length
        if(len){
            this.transaction[len-1][key] = value
        }else {
            this.lookupMap[key] = value
        }
        
    }
    
    delete(key) {
        const len = this.transaction.length
        if(len) {
            this.transaction[len-1][key] = undefined
        } else {
            delete this.lookupMap[key]
        }
    }
    
    begin() {
        this.transaction.push({})
    }
    
    commit() {
        if(!this.transaction.length) return "nothing to commit"
        
        const newestTransaction = this.transaction.pop()
        const len = this.transaction.length
        if(len === 0) {
            this.lookupMap = {
                ...this.lookupMap,
                ...newestTransaction
            }
        } else {
            this.transaction[len-1] = {
                ...this.transaction[len-1],
                ...newestTransaction
            }
        }
        
    }
    
    rollback() {
        if(this.transaction.length) {
            this.transaction.pop()
        }
    }
}
Editor is loading...
Leave a Comment