Skip to content

Commit

Permalink
up: math - update the value compare op chars
Browse files Browse the repository at this point in the history
  • Loading branch information
inhere committed Sep 29, 2022
1 parent 99246f0 commit 5c30935
Show file tree
Hide file tree
Showing 7 changed files with 198 additions and 133 deletions.
81 changes: 81 additions & 0 deletions mathutil/check.go
@@ -0,0 +1,81 @@
package mathutil

// Compare intX,floatX value by given op. returns `srcVal op(=,!=,<,<=,>,>=) dstVal`
//
// Usage:
//
// mathutil.Compare(2, 3, ">") // false
// mathutil.Compare(2, 1.3, ">") // true
// mathutil.Compare(2.2, 1.3, ">") // true
// mathutil.Compare(2.1, 2, ">") // true
func Compare(srcVal, dstVal interface{}, op string) (ok bool) {
if srcVal == nil || dstVal == nil {
return false
}

// float
if srcFlt, ok := srcVal.(float64); ok {
if dstFlt, err := ToFloat(dstVal); err == nil {
return CompFloat(srcFlt, dstFlt, op)
}
return false
}

if srcFlt, ok := srcVal.(float32); ok {
if dstFlt, err := ToFloat(dstVal); err == nil {
return CompFloat(float64(srcFlt), dstFlt, op)
}
return false
}

// as int64
srcInt, err := ToInt64(srcVal)
if err != nil {
return false
}

dstInt, err := ToInt64(dstVal)
if err != nil {
return false
}

return CompInt64(srcInt, dstInt, op)
}

// CompInt64 compare int64, returns the srcI64 op dstI64
func CompInt64(srcI64, dstI64 int64, op string) (ok bool) {
switch op {
case "<", "lt":
ok = srcI64 < dstI64
case "<=", "lte":
ok = srcI64 <= dstI64
case ">", "gt":
ok = srcI64 > dstI64
case ">=", "gte":
ok = srcI64 >= dstI64
case "=", "eq":
ok = srcI64 == dstI64
case "!=", "ne", "neq":
ok = srcI64 != dstI64
}
return
}

// CompFloat compare float64
func CompFloat(srcF64, dstF64 float64, op string) (ok bool) {
switch op {
case "<", "lt":
ok = srcF64 < dstF64
case "<=", "lte":
ok = srcF64 <= dstF64
case ">", "gt":
ok = srcF64 > dstF64
case ">=", "gte":
ok = srcF64 >= dstF64
case "=", "eq":
ok = srcF64 == dstF64
case "!=", "ne", "neq":
ok = srcF64 != dstF64
}
return
}
43 changes: 43 additions & 0 deletions mathutil/check_test.go
@@ -0,0 +1,43 @@
package mathutil_test

import (
"testing"

"github.com/gookit/goutil/comdef"
"github.com/gookit/goutil/mathutil"
"github.com/gookit/goutil/testutil/assert"
)

func TestCompare(t *testing.T) {
tests := []struct {
x, y interface{}
op string
}{
{2, 2, comdef.OpEq},
{2, 3, comdef.OpNeq},
{2, 3, comdef.OpLt},
{2, 3, comdef.OpLte},
{2, 2, comdef.OpLte},
{2, 1, comdef.OpGt},
{2, 2, comdef.OpGte},
{2, 1, comdef.OpGte},
{2.2, 2.2, comdef.OpEq},
{2.2, 3.1, comdef.OpNeq},
{2.3, 3.2, comdef.OpLt},
{2.3, 3.3, comdef.OpLte},
{2.3, 2.3, comdef.OpLte},
{2.3, 1.3, comdef.OpGt},
{2.3, 2.3, comdef.OpGte},
{2.3, 1.3, comdef.OpGte},
}

for _, test := range tests {
assert.True(t, mathutil.Compare(test.x, test.y, test.op))
}

assert.False(t, mathutil.Compare(2, 3, comdef.OpGt))
assert.False(t, mathutil.Compare(nil, 3, comdef.OpGt))
assert.False(t, mathutil.Compare(2, nil, comdef.OpGt))
assert.False(t, mathutil.Compare("abc", 3, comdef.OpGt))
assert.False(t, mathutil.Compare(2, "def", comdef.OpGt))
}
79 changes: 0 additions & 79 deletions mathutil/mathutil.go
Expand Up @@ -38,82 +38,3 @@ func SwapMaxI64(x, y int64) (int64, int64) {
}
return y, x
}

// Compare intX,floatX value by given op. returns `srcVal op(=,!=,<,<=,>,>=) dstVal`
//
// Usage:
// mathutil.Compare(2, 3, ">") // false
// mathutil.Compare(2, 1.3, ">") // true
// mathutil.Compare(2.2, 1.3, ">") // true
// mathutil.Compare(2.1, 2, ">") // true
func Compare(srcVal, dstVal interface{}, op string) (ok bool) {
if srcVal == nil || dstVal == nil {
return false
}

// float
if srcFlt, ok := srcVal.(float64); ok {
if dstFlt, err := ToFloat(dstVal); err == nil {
return CompFloat(srcFlt, dstFlt, op)
}
return false
}

if srcFlt, ok := srcVal.(float32); ok {
if dstFlt, err := ToFloat(dstVal); err == nil {
return CompFloat(float64(srcFlt), dstFlt, op)
}
return false
}

// as int64
srcInt, err := ToInt64(srcVal)
if err != nil {
return false
}

dstInt, err := ToInt64(dstVal)
if err != nil {
return false
}

return CompInt64(srcInt, dstInt, op)
}

// CompInt64 compare int64, returns the srcI64 op dstI64
func CompInt64(srcI64, dstI64 int64, op string) (ok bool) {
switch op {
case "<":
ok = srcI64 < dstI64
case "<=":
ok = srcI64 <= dstI64
case ">":
ok = srcI64 > dstI64
case ">=":
ok = srcI64 >= dstI64
case "=":
ok = srcI64 == dstI64
case "!=":
ok = srcI64 != dstI64
}
return
}

// CompFloat compare float64
func CompFloat(srcF64, dstF64 float64, op string) (ok bool) {
switch op {
case "<":
ok = srcF64 < dstF64
case "<=":
ok = srcF64 <= dstF64
case ">":
ok = srcF64 > dstF64
case ">=":
ok = srcF64 >= dstF64
case "=":
ok = srcF64 == dstF64
case "!=":
ok = srcF64 != dstF64
}
return
}
35 changes: 0 additions & 35 deletions mathutil/mathutil_test.go
Expand Up @@ -3,7 +3,6 @@ package mathutil_test
import (
"testing"

"github.com/gookit/goutil/comdef"
"github.com/gookit/goutil/mathutil"
"github.com/gookit/goutil/testutil/assert"
)
Expand All @@ -28,37 +27,3 @@ func TestSwapMaxInt(t *testing.T) {
assert.Eq(t, int64(34), x64)
assert.Eq(t, int64(2), y64)
}

func TestCompare(t *testing.T) {
tests := []struct {
x, y interface{}
op string
}{
{2, 2, comdef.OpEq},
{2, 3, comdef.OpNeq},
{2, 3, comdef.OpLt},
{2, 3, comdef.OpLte},
{2, 2, comdef.OpLte},
{2, 1, comdef.OpGt},
{2, 2, comdef.OpGte},
{2, 1, comdef.OpGte},
{2.2, 2.2, comdef.OpEq},
{2.2, 3.1, comdef.OpNeq},
{2.3, 3.2, comdef.OpLt},
{2.3, 3.3, comdef.OpLte},
{2.3, 2.3, comdef.OpLte},
{2.3, 1.3, comdef.OpGt},
{2.3, 2.3, comdef.OpGte},
{2.3, 1.3, comdef.OpGte},
}

for _, test := range tests {
assert.True(t, mathutil.Compare(test.x, test.y, test.op))
}

assert.False(t, mathutil.Compare(2, 3, comdef.OpGt))
assert.False(t, mathutil.Compare(nil, 3, comdef.OpGt))
assert.False(t, mathutil.Compare(2, nil, comdef.OpGt))
assert.False(t, mathutil.Compare("abc", 3, comdef.OpGt))
assert.False(t, mathutil.Compare(2, "def", comdef.OpGt))
}
12 changes: 7 additions & 5 deletions strutil/check.go
Expand Up @@ -159,15 +159,17 @@ func Compare(s1, s2, op string) bool {
// VersionCompare for two version string.
func VersionCompare(v1, v2, op string) bool {
switch op {
case ">":
case ">", "gt":
return v1 > v2
case "<":
case "<", "lt":
return v1 < v2
case ">=":
case ">=", "gte":
return v1 >= v2
case "<=":
case "<=", "lte":
return v1 <= v2
default:
case "!=", "ne", "neq":
return v1 != v2
default: // eq
return v1 == v2
}
}
14 changes: 0 additions & 14 deletions strutil/parser/scanner.go

This file was deleted.

67 changes: 67 additions & 0 deletions strutil/tscanner/scanner.go
@@ -0,0 +1,67 @@
// Package tscanner text-scanner
package tscanner

import (
"io"
"text/scanner"
)

const (
TokInvalid = iota
TokComments
TokILComments
TokMLComments
TokValue
TokMLValue
)

const (
Value = iota
MValue
)

type tokenItem struct {
// see TokValueLine
kind rune
// key string. eg: top.sub.some-key
key string

// token value
value string
// for multi line value.
values []string
// for multi line comments.
comments []string
}

func newTokenItem(key, value string, kind rune) *tokenItem {
tk := &tokenItem{
key: key,
kind: kind,
value: value,
}

return tk
}

// Valid of the token data.
func (ti *tokenItem) addValue(val string) {
ti.values = append(ti.values, val)
}

const bufLen = 1024 // at least utf8.UTFMax

// TextScanner struct.
// refer text/scanner.Scanner
type TextScanner struct {
scanner.Position
// Input
src io.Reader

// k-v split char, default is "="
kvSep string
}

func (s TextScanner) Next() *tokenItem {

}

0 comments on commit 5c30935

Please sign in to comment.