github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/examples/gno.land/p/demo/gnorkle/storage/simple/storage.gno (about)

     1  package simple
     2  
     3  import (
     4  	"time"
     5  
     6  	"gno.land/p/demo/gnorkle/feed"
     7  	"gno.land/p/demo/gnorkle/storage"
     8  )
     9  
    10  // Storage is simple, bounded storage for published feed values.
    11  type Storage struct {
    12  	values    []feed.Value
    13  	maxValues uint
    14  }
    15  
    16  // NewStorage creates a new Storage with the given maximum number of values.
    17  // If maxValues is 0, the storage is bounded to a size of one. If this is not desirable,
    18  // then don't provide a value of 0.
    19  func NewStorage(maxValues uint) *Storage {
    20  	if maxValues == 0 {
    21  		maxValues = 1
    22  	}
    23  
    24  	return &Storage{
    25  		maxValues: maxValues,
    26  	}
    27  }
    28  
    29  // Put adds a new value to the storage. If the storage is full, the oldest value
    30  // is removed. If maxValues is 0, the storage is bounded to a size of one.
    31  func (s *Storage) Put(value string) error {
    32  	if s == nil {
    33  		return storage.ErrUndefined
    34  	}
    35  
    36  	s.values = append(s.values, feed.Value{String: value, Time: time.Now()})
    37  	if uint(len(s.values)) > s.maxValues {
    38  		s.values = s.values[1:]
    39  	}
    40  
    41  	return nil
    42  }
    43  
    44  // GetLatest returns the most recently added value, or an empty value if none exist.
    45  func (s Storage) GetLatest() feed.Value {
    46  	if len(s.values) == 0 {
    47  		return feed.Value{}
    48  	}
    49  
    50  	return s.values[len(s.values)-1]
    51  }
    52  
    53  // GetHistory returns all values in the storage, from oldest to newest.
    54  func (s Storage) GetHistory() []feed.Value {
    55  	return s.values
    56  }