unicode/cldr: improve documentation

Change-Id: I376ad957a3417cc909f828786d6faf2a0d61bb1f
Reviewed-on: https://go-review.googlesource.com/101995
Run-TryBot: Marcel van Lohuizen <mpvl@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ross Light <light@google.com>
diff --git a/unicode/cldr/cldr.go b/unicode/cldr/cldr.go
index 2197f8a..052845f 100644
--- a/unicode/cldr/cldr.go
+++ b/unicode/cldr/cldr.go
@@ -5,14 +5,15 @@
 //go:generate go run makexml.go -output xml.go
 
 // Package cldr provides a parser for LDML and related XML formats.
-// This package is intended to be used by the table generation tools
-// for the various internationalization-related packages.
-// As the XML types are generated from the CLDR DTD, and as the CLDR standard
-// is periodically amended, this package may change considerably over time.
-// This mostly means that data may appear and disappear between versions.
-// That is, old code should keep compiling for newer versions, but data
-// may have moved or changed.
-// CLDR version 22 is the first version supported by this package.
+//
+// This package is intended to be used by the table generation tools for the
+// various packages in x/text and is not internal for historical reasons.
+//
+// As the XML types are generated from the CLDR DTD, and as the CLDR standard is
+// periodically amended, this package may change considerably over time. This
+// mostly means that data may appear and disappear between versions. That is,
+// old code should keep compiling for newer versions, but data may have moved or
+// changed. CLDR version 22 is the first version supported by this package.
 // Older versions may not work.
 package cldr // import "golang.org/x/text/unicode/cldr"
 
@@ -94,6 +95,12 @@
 
 // LDML returns the fully resolved LDML XML for loc, which must be one of
 // the strings returned by Locales.
+//
+// Deprecated: use RawLDML and implement inheritance manually or using the
+// internal cldrtree package.
+// Inheritance has changed quite a bit since the onset of this package and in
+// practice data often represented in a way where knowledge of how it was
+// inherited is relevant.
 func (cldr *CLDR) LDML(loc string) (*LDML, error) {
 	return cldr.resolve(loc)
 }
diff --git a/unicode/cldr/decode.go b/unicode/cldr/decode.go
index 094d431..bb4d4d1 100644
--- a/unicode/cldr/decode.go
+++ b/unicode/cldr/decode.go
@@ -58,9 +58,10 @@
 			if len(d.dirFilter) > 0 && !in(d.dirFilter, m[1]) {
 				continue
 			}
-			var r io.Reader
+			var r io.ReadCloser
 			if r, err = l.Reader(i); err == nil {
 				err = d.decode(m[1], m[2], r)
+				r.Close()
 			}
 			if err != nil {
 				return nil, err
diff --git a/unicode/cldr/examples_test.go b/unicode/cldr/examples_test.go
index 1a69b00..85d79d1 100644
--- a/unicode/cldr/examples_test.go
+++ b/unicode/cldr/examples_test.go
@@ -2,10 +2,85 @@
 
 import (
 	"fmt"
+	"os"
+	"path/filepath"
 
+	"golang.org/x/text/internal/gen"
 	"golang.org/x/text/unicode/cldr"
 )
 
+func ExampleDecoder() {
+	// Obtain the default CLDR reader (only for x/text packages).
+
+	var d cldr.Decoder
+
+	// Speed up decoding by setting filters for only what you need.
+	d.SetDirFilter("main", "supplemental")
+	d.SetSectionFilter("numbers", "plurals")
+
+	cldr, err := d.DecodeZip(gen.OpenCLDRCoreZip())
+	if err != nil {
+		fmt.Println("ERROR", err)
+		return
+	}
+	supplemental := cldr.Supplemental()
+
+	fmt.Println(supplemental.MeasurementData.MeasurementSystem[0].Type)
+	for _, lang := range cldr.Locales() {
+		data := cldr.RawLDML(lang)
+		fmt.Println(lang, data.Identity.Version.Number)
+	}
+}
+
+func ExampleDecoder_DecodePath() {
+	// This directory will exist if a go generate has been run in any of the
+	// packages in x/text using the cldr package.
+	path := filepath.FromSlash("../../DATA/cldr/" + cldr.Version)
+
+	var d cldr.Decoder
+
+	// Speed up decoding by setting filters for only what you need.
+	d.SetDirFilter("main")
+	d.SetSectionFilter("numbers")
+
+	cldr, err := d.DecodePath(path)
+	if err != nil {
+		// handle error
+		fmt.Println("ERROR", err)
+		return
+	}
+	for _, lang := range cldr.Locales() {
+		if numbers := cldr.RawLDML(lang).Numbers; numbers != nil {
+			fmt.Println(lang, len(numbers.Symbols))
+		}
+	}
+}
+
+func ExampleDecoder_DecodeZip() {
+	// This directory will exist if a go generate has been run in any of the
+	// packages in x/text using the cldr package.
+	path := filepath.FromSlash("../../DATA/cldr/" + cldr.Version)
+
+	var d cldr.Decoder
+
+	r, err := os.Open(filepath.Join(path, "core.zip"))
+	if err != nil {
+		fmt.Println("error:", err)
+		return
+	}
+
+	// Only loading supplemental data can be done much faster using a dir
+	// filter.
+	d.SetDirFilter("supplemental")
+	cldr, err := d.DecodeZip(r)
+	if err != nil {
+		fmt.Println("error:", err)
+		return
+	}
+
+	fmt.Println(cldr.Supplemental().MeasurementData.MeasurementSystem[0].Type)
+}
+
 func ExampleSlice() {
 	var dr *cldr.CLDR // assume this is initialized