package set

import "time"

// Interface for an item storeable in the set
type Item interface {
	Key() string
	Value() interface{}
}

type item struct {
	key   string
	value interface{}
}

func (item *item) Key() string {
	return item.key
}

func (item *item) Value() interface{} {
	return item.value
}

func Itemize(key string, value interface{}) Item {
	return &item{key, value}
}

type StringItem string

func (item StringItem) Key() string {
	return string(item)
}

func (item StringItem) Value() interface{} {
	return true
}

func Expire(item Item, d time.Duration) Item {
	return &ExpiringItem{
		Item: item,
		Time: time.Now().Add(d),
	}
}

type ExpiringItem struct {
	Item
	time.Time
}

func (item *ExpiringItem) Expired() bool {
	return time.Now().After(item.Time)
}

func (item *ExpiringItem) Value() interface{} {
	if item.Expired() {
		return nil
	}
	return item.Item.Value()
}