package histutil

import 

// NewDedupCursor returns a cursor that skips over all duplicate entries.
func ( Cursor) Cursor {
	return &dedupCursor{, 0, nil, make(map[string]bool)}
}

type dedupCursor struct {
	c       Cursor
	current int
	stack   []store.Cmd
	occ     map[string]bool
}

func ( *dedupCursor) () {
	if .current < len(.stack)-1 {
		.current++
		return
	}
	for {
		.c.Prev()
		,  := .c.Get()
		if  != nil {
			.current = len(.stack)
			break
		}
		if !.occ[.Text] {
			.current = len(.stack)
			.stack = append(.stack, )
			.occ[.Text] = true
			break
		}
	}
}

func ( *dedupCursor) () {
	if .current >= 0 {
		.current--
	}
}

func ( *dedupCursor) () (store.Cmd, error) {
	switch {
	case .current < 0:
		return store.Cmd{}, ErrEndOfHistory
	case .current < len(.stack):
		return .stack[.current], nil
	default:
		return .c.Get()
	}
}