From ecb21f33362367d44215af73f060f32485155893 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Mon, 29 Aug 2022 22:42:12 -0600 Subject: wip --- lib/containers/set.go | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 lib/containers/set.go (limited to 'lib/containers') diff --git a/lib/containers/set.go b/lib/containers/set.go new file mode 100644 index 0000000..e20b5be --- /dev/null +++ b/lib/containers/set.go @@ -0,0 +1,60 @@ +// Copyright (C) 2022 Luke Shumaker +// +// SPDX-License-Identifier: GPL-2.0-or-later + +package containers + +import ( + "io" + + "git.lukeshu.com/go/lowmemjson" + "golang.org/x/exp/constraints" + + "git.lukeshu.com/btrfs-progs-ng/lib/maps" +) + +type Set[T constraints.Ordered] map[T]struct{} + +var ( + _ lowmemjson.Encodable = Set[int]{} + _ lowmemjson.Decodable = (*Set[int])(nil) +) + +func (o Set[T]) EncodeJSON(w io.Writer) error { + return lowmemjson.Encode(w, maps.SortedKeys(o)) +} + +func (o *Set[T]) DecodeJSON(r io.RuneScanner) error { + c, _, _ := r.ReadRune() + if c == 'n' { + _, _, _ = r.ReadRune() // u + _, _, _ = r.ReadRune() // l + _, _, _ = r.ReadRune() // l + *o = nil + return nil + } + _ = r.UnreadRune() + *o = Set[T]{} + return lowmemjson.DecodeArray(r, func(r io.RuneScanner) error { + var val T + if err := lowmemjson.Decode(r, &val); err != nil { + return err + } + (*o)[val] = struct{}{} + return nil + }) +} + +func (o *Set[T]) Insert(v T) { + if o == nil { + *o = Set[T]{} + } + (*o)[v] = struct{}{} +} + +func (o *Set[T]) Delete(v T) { + if o == nil { + return + } + delete(*o, v) +} -- cgit v1.2.3-54-g00ecf