// Copyright 2025 The JSON Schema Go Project Authors. All rights reserved.
// Use of this source code is governed by an MIT-style
// license that can be found in the LICENSE file.

package jsonschema

import 

// An annotations tracks certain properties computed by keywords that are used by validation.
// ("Annotation" is the spec's term.)
// In particular, the unevaluatedItems and unevaluatedProperties keywords need to know which
// items and properties were evaluated (validated successfully).
type annotations struct {
	allItems            bool            // all items were evaluated
	endIndex            int             // 1+largest index evaluated by prefixItems
	evaluatedIndexes    map[int]bool    // set of indexes evaluated by contains
	allProperties       bool            // all properties were evaluated
	evaluatedProperties map[string]bool // set of properties evaluated by various keywords
}

// noteIndex marks i as evaluated.
func ( *annotations) ( int) {
	if .evaluatedIndexes == nil {
		.evaluatedIndexes = map[int]bool{}
	}
	.evaluatedIndexes[] = true
}

// noteEndIndex marks items with index less than end as evaluated.
func ( *annotations) ( int) {
	if  > .endIndex {
		.endIndex = 
	}
}

// noteProperty marks prop as evaluated.
func ( *annotations) ( string) {
	if .evaluatedProperties == nil {
		.evaluatedProperties = map[string]bool{}
	}
	.evaluatedProperties[] = true
}

// noteProperties marks all the properties in props as evaluated.
func ( *annotations) ( map[string]bool) {
	.evaluatedProperties = merge(.evaluatedProperties, )
}

// merge adds b's annotations to a.
// a must not be nil.
func ( *annotations) ( *annotations) {
	if  == nil {
		return
	}
	if .allItems {
		.allItems = true
	}
	if .endIndex > .endIndex {
		.endIndex = .endIndex
	}
	.evaluatedIndexes = merge(.evaluatedIndexes, .evaluatedIndexes)
	if .allProperties {
		.allProperties = true
	}
	.evaluatedProperties = merge(.evaluatedProperties, .evaluatedProperties)
}

// merge adds t's keys to s and returns s.
// If s is nil, it returns a copy of t.
func merge[ comparable](,  map[]bool) map[]bool {
	if  == nil {
		return maps.Clone()
	}
	maps.Copy(, )
	return 
}