package template

func NewSlice(s string) Slice {
	return Slice{
		source: &s,
		start:  0,
		end:    len(s),
	}
}

type Slice struct {
	source     *string
	start, end int
}

func (s Slice) Chars() []byte {
	return []byte((*s.source)[s.start:s.end])
}

func (s Slice) Len() int {
	return s.end - s.start
}

func (s Slice) At(i int) byte {
	return (*s.source)[s.start+i]
}

func SliceFromString(s string, start, end int) Slice {
	return Slice{
		source: &s,
		start:  start,
		end:    end,
	}
}

func (s Slice) String() string {
	return (*s.source)[s.start:s.end]
}

func (s Slice) Slice(start, end int) Slice {
	return Slice{
		source: s.source,
		start:  s.start + start,
		end:    s.start + end,
	}
}
