github.com/biogo/store@v0.0.0-20201120204734-aad293a2328f/interval/interval_example_test.go (about)

     1  // Copyright ©2012 The bíogo Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package interval_test
     6  
     7  import (
     8  	"fmt"
     9  
    10  	"github.com/biogo/store/interval"
    11  )
    12  
    13  // Generic intervals
    14  type Int int
    15  
    16  func (c Int) Compare(b interval.Comparable) int {
    17  	return int(c - b.(Int))
    18  }
    19  
    20  type Interval struct {
    21  	start, end Int
    22  	id         uintptr
    23  	Sub        []Interval
    24  	Payload    interface{}
    25  }
    26  
    27  func (i Interval) Overlap(b interval.Range) bool {
    28  	var start, end Int
    29  	switch bc := b.(type) {
    30  	case Interval:
    31  		start, end = bc.start, bc.end
    32  	case *Mutable:
    33  		start, end = bc.start, bc.end
    34  	default:
    35  		panic("unknown type")
    36  	}
    37  
    38  	// Half-open interval indexing.
    39  	return i.end > start && i.start < end
    40  }
    41  func (i Interval) ID() uintptr                  { return i.id }
    42  func (i Interval) Start() interval.Comparable   { return i.start }
    43  func (i Interval) End() interval.Comparable     { return i.end }
    44  func (i Interval) NewMutable() interval.Mutable { return &Mutable{i.start, i.end} }
    45  func (i Interval) String() string               { return fmt.Sprintf("[%d,%d)#%d", i.start, i.end, i.id) }
    46  
    47  type Mutable struct{ start, end Int }
    48  
    49  func (m *Mutable) Start() interval.Comparable     { return m.start }
    50  func (m *Mutable) End() interval.Comparable       { return m.end }
    51  func (m *Mutable) SetStart(c interval.Comparable) { m.start = c.(Int) }
    52  func (m *Mutable) SetEnd(c interval.Comparable)   { m.end = c.(Int) }
    53  
    54  var ivs = []Interval{
    55  	{start: 0, end: 2},
    56  	{start: 2, end: 4},
    57  	{start: 1, end: 6},
    58  	{start: 3, end: 4},
    59  	{start: 1, end: 3},
    60  	{start: 4, end: 6},
    61  	{start: 5, end: 8},
    62  	{start: 6, end: 8},
    63  	{start: 5, end: 7},
    64  	{start: 8, end: 9},
    65  }
    66  
    67  func Example_1() {
    68  	t := &interval.Tree{}
    69  	for i, iv := range ivs {
    70  		iv.id = uintptr(i)
    71  		err := t.Insert(iv, false)
    72  		if err != nil {
    73  			fmt.Println(err)
    74  		}
    75  	}
    76  
    77  	fmt.Println("Generic interval tree:")
    78  	fmt.Println(t.Get(Interval{start: 3, end: 6}))
    79  
    80  	// Output:
    81  	// Generic interval tree:
    82  	// [[1,6)#2 [2,4)#1 [3,4)#3 [4,6)#5 [5,8)#6 [5,7)#8]
    83  }