Skip to main content

is

import "github.com/go-softwarelab/common/pkg/is"

Package is provides a comprehensive set of predicates and validation functions for common conditional checks in Go applications.

The goal of this package is to offer concise, reusable predicate functions that can be used for common validation scenarios, reducing boilerplate code and improving readability. The functions can be combined with other predicates using operators like Not() to create more complex conditions.

These utilities are designed to be used in functional programming patterns and conditional logic while maintaining type safety through generics.

Variables

Bool checks if a value is a bool.

var Bool = Type[bool]

Int checks if a value is an int.

var Int = Type[int]

String checks if a value is a string.

var String = Type[string]

Between

func Between[T types.Ordered](value, a, b T) bool

Between checks if a value is between two others.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// Between checks if a value falls within a range (inclusive)
fmt.Printf("%T(%v)\n", is.Between(25, 18, 65), is.Between(25, 18, 65))
fmt.Printf("%T(%v)\n", is.Between(18, 18, 65), is.Between(18, 18, 65))
fmt.Printf("%T(%v)\n", is.Between(65, 18, 65), is.Between(65, 18, 65))
fmt.Printf("%T(%v)\n", is.Between(17, 18, 65), is.Between(17, 18, 65))
fmt.Printf("%T(%v)\n", is.Between(66, 18, 65), is.Between(66, 18, 65))

}

Output

bool(true)
bool(true)
bool(true)
bool(false)
bool(false)

BetweenThe

func BetweenThe[T types.Ordered](a, b T) func(T) bool

BetweenThe checks returns the function that checks if a value is between two others.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// BetweenThe creates a function checking if values are within a range
isWorkingAge := is.BetweenThe(18, 65)

fmt.Printf("%T(%v)\n", isWorkingAge(25), isWorkingAge(25))
fmt.Printf("%T(%v)\n", isWorkingAge(18), isWorkingAge(18))
fmt.Printf("%T(%v)\n", isWorkingAge(65), isWorkingAge(65))
fmt.Printf("%T(%v)\n", isWorkingAge(16), isWorkingAge(16))
fmt.Printf("%T(%v)\n", isWorkingAge(70), isWorkingAge(70))

// Temperature range checker (comfortable room temperature 20-25°C)
isComfortableTemp := is.BetweenThe(20.0, 25.0)
fmt.Printf("%T(%v)\n", isComfortableTemp(22.5), isComfortableTemp(22.5))
fmt.Printf("%T(%v)\n", isComfortableTemp(18.0), isComfortableTemp(18.0))

}

Output

bool(true)
bool(true)
bool(true)
bool(false)
bool(false)
bool(true)
bool(false)

BlankString

func BlankString[S string | *string](str S) (isBlank bool)

BlankString returns true if the string is empty or contains only whitespace

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// BlankString checks if a string is empty or contains only whitespace
fmt.Println("Checking for blank strings:")
fmt.Printf("is.BlankString(\"\"): %T(%v) - empty string\n", is.BlankString(""), is.BlankString(""))
fmt.Printf("is.BlankString(\" \"): %T(%v) - whitespace only\n", is.BlankString(" "), is.BlankString(" "))
fmt.Printf("is.BlankString(\"\\t\\n\"): %T(%v) - tabs and newlines\n", is.BlankString("\t\n"), is.BlankString("\t\n"))
fmt.Printf("is.BlankString(\"hello\"): %T(%v) - non-blank string\n", is.BlankString("hello"), is.BlankString("hello"))

}

Output

Checking for blank strings:
is.BlankString(""): bool(true) - empty string
is.BlankString(" "): bool(true) - whitespace only
is.BlankString("\t\n"): bool(true) - tabs and newlines
is.BlankString("hello"): bool(false) - non-blank string

Empty

func Empty[T comparable](value T) bool

Empty checks if a value is zero value.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// Testing zero/empty values of different types
fmt.Println("Checking for empty/zero values:")

fmt.Printf("is.Empty(0): %T(%v) - zero int\n", is.Empty(0), is.Empty(0))
fmt.Printf("is.Empty(42): %T(%v) - non-zero int\n", is.Empty(42), is.Empty(42))

fmt.Printf("is.Empty(\"\"): %T(%v) - empty string\n", is.Empty(""), is.Empty(""))
fmt.Printf("is.Empty(\"hello\"): %T(%v) - non-empty string\n", is.Empty("hello"), is.Empty("hello"))

fmt.Printf("is.Empty(false): %T(%v) - zero bool\n", is.Empty(false), is.Empty(false))
fmt.Printf("is.Empty(true): %T(%v) - non-zero bool\n", is.Empty(true), is.Empty(true))

}

Output

Checking for empty/zero values:
is.Empty(0): bool(true) - zero int
is.Empty(42): bool(false) - non-zero int
is.Empty(""): bool(true) - empty string
is.Empty("hello"): bool(false) - non-empty string
is.Empty(false): bool(true) - zero bool
is.Empty(true): bool(false) - non-zero bool

EmptyString

func EmptyString[S string | *string](s S) (isEmpty bool)

EmptyString returns true if the string is empty

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// EmptyString checks if a string is empty
fmt.Println("Checking for empty strings:")
fmt.Printf("is.EmptyString(\"\"): %T(%v) - empty string\n", is.EmptyString(""), is.EmptyString(""))
fmt.Printf("is.EmptyString(\"hello\"): %T(%v) - non-empty string\n", is.EmptyString("hello"), is.EmptyString("hello"))

}

Output

Checking for empty strings:
is.EmptyString(""): bool(true) - empty string
is.EmptyString("hello"): bool(false) - non-empty string

Equal

func Equal[T comparable](a, b T) bool

Equal checks if two values are equal.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// Equal checks equality between two values
fmt.Println("Checking equality:")
fmt.Printf("is.Equal(42, 42): %v (same integers)\n", is.Equal(42, 42))
fmt.Printf("is.Equal(42, 43): %v (different integers)\n", is.Equal(42, 43))
fmt.Printf("is.Equal(\"hello\", \"hello\"): %v (same strings)\n", is.Equal("hello", "hello"))
fmt.Printf("is.Equal(\"hello\", \"world\"): %v (different strings)\n", is.Equal("hello", "world"))

}

Output

Checking equality:
is.Equal(42, 42): true (same integers)
is.Equal(42, 43): false (different integers)
is.Equal("hello", "hello"): true (same strings)
is.Equal("hello", "world"): false (different strings)

EqualTo

func EqualTo[T comparable](expected T) func(T) bool

EqualTo returns the function that checks if a value is equal to another.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// EqualTo creates a function that checks for equality with a specific value
fmt.Println("Using equality checker functions:")

// Create a function that checks if a value equals 42
isFortyTwo := is.EqualTo(42)
fmt.Printf("isFortyTwo(42): %v (matching value)\n", isFortyTwo(42))
fmt.Printf("isFortyTwo(43): %v (non-matching value)\n", isFortyTwo(43))

// Create a function that checks if a string equals "admin"
isAdmin := is.EqualTo("admin")
fmt.Printf("isAdmin(\"admin\"): %v (matching role)\n", isAdmin("admin"))
fmt.Printf("isAdmin(\"user\"): %v (non-matching role)\n", isAdmin("user"))

}

Output

Using equality checker functions:
isFortyTwo(42): true (matching value)
isFortyTwo(43): false (non-matching value)
isAdmin("admin"): true (matching role)
isAdmin("user"): false (non-matching role)

Greater

func Greater[T types.Ordered](a, b T) bool

Greater checks if a value is greater than another.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// Greater checks if first value is greater than second
fmt.Println("Checking greater than relation:")
fmt.Printf("is.Greater(42, 30): %v (42 > 30)\n", is.Greater(42, 30))
fmt.Printf("is.Greater(30, 42): %v (30 > 42)\n", is.Greater(30, 42))
fmt.Printf("is.Greater(42, 42): %v (42 > 42)\n", is.Greater(42, 42))

// String comparison is lexicographic
fmt.Printf("is.Greater(\"zebra\", \"apple\"): %v (alphabetical order)\n", is.Greater("zebra", "apple"))
fmt.Printf("is.Greater(\"apple\", \"zebra\"): %v (alphabetical order)\n", is.Greater("apple", "zebra"))

}

Output

Checking greater than relation:
is.Greater(42, 30): true (42 > 30)
is.Greater(30, 42): false (30 > 42)
is.Greater(42, 42): false (42 > 42)
is.Greater("zebra", "apple"): true (alphabetical order)
is.Greater("apple", "zebra"): false (alphabetical order)

GreaterOrEqual

func GreaterOrEqual[T types.Ordered](a, b T) bool

GreaterOrEqual checks if a value is greater than or equal to another.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// GreaterOrEqual checks if first value is greater than or equal to second
fmt.Println("Checking greater than or equal relation:")
fmt.Printf("is.GreaterOrEqual(42, 30): %v (42 ≥ 30)\n", is.GreaterOrEqual(42, 30))
fmt.Printf("is.GreaterOrEqual(42, 42): %v (42 ≥ 42)\n", is.GreaterOrEqual(42, 42))
fmt.Printf("is.GreaterOrEqual(30, 42): %v (30 ≥ 42)\n", is.GreaterOrEqual(30, 42))

}

Output

Checking greater than or equal relation:
is.GreaterOrEqual(42, 30): true (42 ≥ 30)
is.GreaterOrEqual(42, 42): true (42 ≥ 42)
is.GreaterOrEqual(30, 42): false (30 ≥ 42)

GreaterOrEqualTo

func GreaterOrEqualTo[T types.Ordered](expected T) func(T) bool

GreaterOrEqualTo returns the function that checks if a value is greater than or equal to another.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// GreaterOrEqualTo creates a function checking if values meet or exceed a threshold
fmt.Println("Using minimum threshold functions:")

// Check if age qualifies for voting (18 or older)
canVote := is.GreaterOrEqualTo(18)
fmt.Printf("canVote(21): %v (21 meets voting age)\n", canVote(21))
fmt.Printf("canVote(18): %v (18 meets voting age)\n", canVote(18))
fmt.Printf("canVote(16): %v (16 below voting age)\n", canVote(16))

// Check if score is passing grade (60 or higher)
isPassing := is.GreaterOrEqualTo(60.0)
fmt.Printf("isPassing(75.5): %v (75.5 is passing)\n", isPassing(75.5))
fmt.Printf("isPassing(60.0): %v (60.0 is passing)\n", isPassing(60.0))
fmt.Printf("isPassing(59.9): %v (59.9 is failing)\n", isPassing(59.9))

}

Output

Using minimum threshold functions:
canVote(21): true (21 meets voting age)
canVote(18): true (18 meets voting age)
canVote(16): false (16 below voting age)
isPassing(75.5): true (75.5 is passing)
isPassing(60.0): true (60.0 is passing)
isPassing(59.9): false (59.9 is failing)

GreaterThan

func GreaterThan[T types.Ordered](expected T) func(T) bool

GreaterThan returns the function that checks if a value is greater than another.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// GreaterThan creates a function that checks if values exceed a threshold
fmt.Println("Using threshold checker functions:")

// Check if age is considered adult (over 18)
isAdult := is.GreaterThan(18)
fmt.Printf("isAdult(21): %v (21 exceeds adult threshold)\n", isAdult(21))
fmt.Printf("isAdult(18): %v (18 equals adult threshold)\n", isAdult(18))
fmt.Printf("isAdult(16): %v (16 below adult threshold)\n", isAdult(16))

// Check if temperature is hot (over 30°C)
isHot := is.GreaterThan(30.0)
fmt.Printf("isHot(35.5): %v (35.5°C exceeds hot threshold)\n", isHot(35.5))
fmt.Printf("isHot(25.0): %v (25.0°C below hot threshold)\n", isHot(25.0))

}

Output

Using threshold checker functions:
isAdult(21): true (21 exceeds adult threshold)
isAdult(18): false (18 equals adult threshold)
isAdult(16): false (16 below adult threshold)
isHot(35.5): true (35.5°C exceeds hot threshold)
isHot(25.0): false (25.0°C below hot threshold)

Less

func Less[T types.Ordered](a, b T) bool

Less checks if a value is less than another.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// Less checks if first value is less than second
fmt.Println("Checking less than relation:")
fmt.Printf("is.Less(30, 42): %v (30 < 42)\n", is.Less(30, 42))
fmt.Printf("is.Less(42, 30): %v (42 < 30)\n", is.Less(42, 30))
fmt.Printf("is.Less(42, 42): %v (42 < 42)\n", is.Less(42, 42))

// String comparison is lexicographic
fmt.Printf("is.Less(\"apple\", \"zebra\"): %v (alphabetical order)\n", is.Less("apple", "zebra"))

}

Output

Checking less than relation:
is.Less(30, 42): true (30 < 42)
is.Less(42, 30): false (42 < 30)
is.Less(42, 42): false (42 < 42)
is.Less("apple", "zebra"): true (alphabetical order)

LessOrEqual

func LessOrEqual[T types.Ordered](a, b T) bool

LessOrEqual checks if a value is less than or equal to another.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// LessOrEqual checks if first value is less than or equal to second
fmt.Println("Checking less than or equal relation:")
fmt.Printf("is.LessOrEqual(30, 42): %v (30 ≤ 42)\n", is.LessOrEqual(30, 42))
fmt.Printf("is.LessOrEqual(42, 42): %v (42 ≤ 42)\n", is.LessOrEqual(42, 42))
fmt.Printf("is.LessOrEqual(50, 42): %v (50 ≤ 42)\n", is.LessOrEqual(50, 42))

}

Output

Checking less than or equal relation:
is.LessOrEqual(30, 42): true (30 ≤ 42)
is.LessOrEqual(42, 42): true (42 ≤ 42)
is.LessOrEqual(50, 42): false (50 ≤ 42)

LessOrEqualTo

func LessOrEqualTo[T types.Ordered](expected T) func(T) bool

LessOrEqualTo returns the function that checks if a value is less than or equal to another.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// LessOrEqualTo creates a function checking if values are at or below a threshold
fmt.Println("Using maximum allowed functions:")

// Check if child qualifies for child pricing (12 or under)
isChildRate := is.LessOrEqualTo(12)
fmt.Printf("isChildRate(10): %v (10 qualifies for child rate)\n", isChildRate(10))
fmt.Printf("isChildRate(12): %v (12 qualifies for child rate)\n", isChildRate(12))
fmt.Printf("isChildRate(13): %v (13 does not qualify for child rate)\n", isChildRate(13))

// Check if luggage is within weight limit (23kg or less)
isWithinWeightLimit := is.LessOrEqualTo(23.0)
fmt.Printf("isWithinWeightLimit(20.5): %v (20.5kg is acceptable)\n", isWithinWeightLimit(20.5))
fmt.Printf("isWithinWeightLimit(23.0): %v (23.0kg is acceptable)\n", isWithinWeightLimit(23.0))
fmt.Printf("isWithinWeightLimit(23.5): %v (23.5kg exceeds limit)\n", isWithinWeightLimit(23.5))

}

Output

Using maximum allowed functions:
isChildRate(10): true (10 qualifies for child rate)
isChildRate(12): true (12 qualifies for child rate)
isChildRate(13): false (13 does not qualify for child rate)
isWithinWeightLimit(20.5): true (20.5kg is acceptable)
isWithinWeightLimit(23.0): true (23.0kg is acceptable)
isWithinWeightLimit(23.5): false (23.5kg exceeds limit)

LessThan

func LessThan[T types.Ordered](expected T) func(T) bool

LessThan returns the function that checks if a value is less than another.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// LessThan creates a function that checks if values are below a threshold
fmt.Println("Using maximum threshold functions:")

// Check if someone is a minor (under 18)
isMinor := is.LessThan(18)
fmt.Printf("isMinor(16): %v (16 is below adult threshold)\n", isMinor(16))
fmt.Printf("isMinor(18): %v (18 equals adult threshold)\n", isMinor(18))
fmt.Printf("isMinor(21): %v (21 exceeds adult threshold)\n", isMinor(21))

// Check if temperature is freezing (below 0°C)
isFreezing := is.LessThan(0.0)
fmt.Printf("isFreezing(-5.0): %v (-5.0°C is freezing)\n", isFreezing(-5.0))
fmt.Printf("isFreezing(0.0): %v (0.0°C at freezing point)\n", isFreezing(0.0))

}

Output

Using maximum threshold functions:
isMinor(16): true (16 is below adult threshold)
isMinor(18): false (18 equals adult threshold)
isMinor(21): false (21 exceeds adult threshold)
isFreezing(-5.0): true (-5.0°C is freezing)
isFreezing(0.0): false (0.0°C at freezing point)

Nil

func Nil(value any) bool

Nil checks if a value is nil.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// Testing nil values
fmt.Println("Checking for nil values:")

var nilSlice []int
fmt.Printf("is.Nil(nil): %T(%v) - literal nil\n", is.Nil(nil), is.Nil(nil))
fmt.Printf("is.Nil(nilSlice): %T(%v) - nil slice\n", is.Nil(nilSlice), is.Nil(nilSlice))

nonNilSlice := make([]int, 0)
fmt.Printf("is.Nil(nonNilSlice): %T(%v) - empty but initialized slice\n", is.Nil(nonNilSlice), is.Nil(nonNilSlice))

var nilMap map[string]int
fmt.Printf("is.Nil(nilMap): %T(%v) - nil map\n", is.Nil(nilMap), is.Nil(nilMap))

}

Output

Checking for nil values:
is.Nil(nil): bool(true) - literal nil
is.Nil(nilSlice): bool(true) - nil slice
is.Nil(nonNilSlice): bool(false) - empty but initialized slice
is.Nil(nilMap): bool(true) - nil map

Not

func Not[T any](predicate func(T) bool) func(T) bool

Not returns a function that inverts the result of the given predicate.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// Create a function to check if a value is positive
isPositive := func(x int) bool {
return x > 0
}

// Create the negation of that function
isNotPositive := is.Not(isPositive)

// Test with various values
fmt.Printf("isNotPositive(5): %T(%v) - positive number\n", isNotPositive(5), isNotPositive(5))
fmt.Printf("isNotPositive(0): %T(%v) - zero\n", isNotPositive(0), isNotPositive(0))
fmt.Printf("isNotPositive(-3): %T(%v) - negative number\n", isNotPositive(-3), isNotPositive(-3))

}

Output

isNotPositive(5): bool(false) - positive number
isNotPositive(0): bool(true) - zero
isNotPositive(-3): bool(true) - negative number

NotBlankString

func NotBlankString[S string | *string](s S) bool

NotBlankString returns true if the string is not empty or contains only whitespace

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// NotBlankString checks if a string has non-whitespace content
fmt.Println("Checking for non-blank strings:")
fmt.Printf("is.NotBlankString(\"hello\"): %T(%v) - string with content\n", is.NotBlankString("hello"), is.NotBlankString("hello"))
fmt.Printf("is.NotBlankString(\" x \"): %T(%v) - string with whitespace and content\n", is.NotBlankString(" x "), is.NotBlankString(" x "))
fmt.Printf("is.NotBlankString(\" \"): %T(%v) - whitespace only\n", is.NotBlankString(" "), is.NotBlankString(" "))
fmt.Printf("is.NotBlankString(\"\"): %T(%v) - empty string\n", is.NotBlankString(""), is.NotBlankString(""))

}

Output

Checking for non-blank strings:
is.NotBlankString("hello"): bool(true) - string with content
is.NotBlankString(" x "): bool(true) - string with whitespace and content
is.NotBlankString(" "): bool(false) - whitespace only
is.NotBlankString(""): bool(false) - empty string

NotEmpty

func NotEmpty[T comparable](value T) bool

NotEmpty checks if a value is not zero value.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// Testing non-empty values of different types
fmt.Println("Checking for non-empty values:")

fmt.Printf("is.NotEmpty(42): %T(%v) - non-zero int\n", is.NotEmpty(42), is.NotEmpty(42))
fmt.Printf("is.NotEmpty(0): %T(%v) - zero int\n", is.NotEmpty(0), is.NotEmpty(0))

fmt.Printf("is.NotEmpty(\"hello\"): %T(%v) - non-empty string\n", is.NotEmpty("hello"), is.NotEmpty("hello"))
fmt.Printf("is.NotEmpty(\"\"): %T(%v) - empty string\n", is.NotEmpty(""), is.NotEmpty(""))

fmt.Printf("is.NotEmpty(true): %T(%v) - non-zero bool\n", is.NotEmpty(true), is.NotEmpty(true))
fmt.Printf("is.NotEmpty(false): %T(%v) - zero bool\n", is.NotEmpty(false), is.NotEmpty(false))

}

Output

Checking for non-empty values:
is.NotEmpty(42): bool(true) - non-zero int
is.NotEmpty(0): bool(false) - zero int
is.NotEmpty("hello"): bool(true) - non-empty string
is.NotEmpty(""): bool(false) - empty string
is.NotEmpty(true): bool(true) - non-zero bool
is.NotEmpty(false): bool(false) - zero bool

NotEmptyString

func NotEmptyString[S string | *string](s S) bool

NotEmptyString returns true if the string is not empty

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// NotEmptyString checks if a string is not empty
fmt.Println("Checking for non-empty strings:")
fmt.Printf("is.NotEmptyString(\"hello\"): %T(%v) - non-empty string\n", is.NotEmptyString("hello"), is.NotEmptyString("hello"))
fmt.Printf("is.NotEmptyString(\" \"): %T(%v) - whitespace string\n", is.NotEmptyString(" "), is.NotEmptyString(" "))
fmt.Printf("is.NotEmptyString(\"\"): %T(%v) - empty string\n", is.NotEmptyString(""), is.NotEmptyString(""))

}

Output

Checking for non-empty strings:
is.NotEmptyString("hello"): bool(true) - non-empty string
is.NotEmptyString(" "): bool(true) - whitespace string
is.NotEmptyString(""): bool(false) - empty string

NotEqual

func NotEqual[T comparable](a, b T) bool

NotEqual checks if two values are not equal.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// NotEqual checks inequality between two values
fmt.Println("Checking inequality:")
fmt.Printf("is.NotEqual(42, 43): %v (different integers)\n", is.NotEqual(42, 43))
fmt.Printf("is.NotEqual(42, 42): %v (same integers)\n", is.NotEqual(42, 42))
fmt.Printf("is.NotEqual(\"hello\", \"world\"): %v (different strings)\n", is.NotEqual("hello", "world"))
fmt.Printf("is.NotEqual(\"hello\", \"hello\"): %v (same strings)\n", is.NotEqual("hello", "hello"))

}

Output

Checking inequality:
is.NotEqual(42, 43): true (different integers)
is.NotEqual(42, 42): false (same integers)
is.NotEqual("hello", "world"): true (different strings)
is.NotEqual("hello", "hello"): false (same strings)

NotNil

func NotNil(value any) bool

NotNil checks if a value is not nil.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// Testing non-nil values
fmt.Println("Checking for non-nil values:")

var nilSlice []int
nonNilSlice := make([]int, 0)

fmt.Printf("is.NotNil(nonNilSlice): %T(%v) - empty but initialized slice\n", is.NotNil(nonNilSlice), is.NotNil(nonNilSlice))
fmt.Printf("is.NotNil(nilSlice): %T(%v) - nil slice\n", is.NotNil(nilSlice), is.NotNil(nilSlice))
fmt.Printf("is.NotNil(\"hello\"): %T(%v) - string value\n", is.NotNil("hello"), is.NotNil("hello"))
fmt.Printf("is.NotNil(nil): %T(%v) - literal nil\n", is.NotNil(nil), is.NotNil(nil))

}

Output

Checking for non-nil values:
is.NotNil(nonNilSlice): bool(true) - empty but initialized slice
is.NotNil(nilSlice): bool(false) - nil slice
is.NotNil("hello"): bool(true) - string value
is.NotNil(nil): bool(false) - literal nil

NotOrError

func NotOrError[T any](predicate func(T) (bool, error)) func(T) (bool, error)

NotOrError returns a function that inverts the result of the given predicate.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// Create a function to check if a value is positive with error handling
isPositiveWithError := func(x int) (bool, error) {
return x > 0, nil
}

// Create the negation of that function
isNotPositiveWithError := is.NotOrError(isPositiveWithError)

// Test with various values
result1, err1 := isNotPositiveWithError(5)
fmt.Printf("isNotPositiveWithError(5): %T(%v), err: %v - positive number\n", result1, result1, err1)

result2, err2 := isNotPositiveWithError(0)
fmt.Printf("isNotPositiveWithError(0): %T(%v), err: %v - zero\n", result2, result2, err2)

result3, err3 := isNotPositiveWithError(-3)
fmt.Printf("isNotPositiveWithError(-3): %T(%v), err: %v - negative number\n", result3, result3, err3)

}

Output

isNotPositiveWithError(5): bool(false), err: <nil> - positive number
isNotPositiveWithError(0): bool(true), err: <nil> - zero
isNotPositiveWithError(-3): bool(true), err: <nil> - negative number

Type

func Type[T any](value any) bool

Type checks if a value is of a specific type.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// Testing type checking
fmt.Println("Type checking:")

value1 := "hello"
value2 := 42
value3 := true

fmt.Printf("is.Type[string](value1): %T(%v) - string value\n", is.Type[string](value1), is.Type[string](value1))
fmt.Printf("is.Type[int](value1): %T(%v) - string value checked as int\n", is.Type[int](value1), is.Type[int](value1))

fmt.Printf("is.Type[int](value2): %T(%v) - int value\n", is.Type[int](value2), is.Type[int](value2))
fmt.Printf("is.Type[string](value2): %T(%v) - int value checked as string\n", is.Type[string](value2), is.Type[string](value2))

fmt.Printf("is.Type[bool](value3): %T(%v) - bool value\n", is.Type[bool](value3), is.Type[bool](value3))

}

Output

Type checking:
is.Type[string](value1): bool(true) - string value
is.Type[int](value1): bool(false) - string value checked as int
is.Type[int](value2): bool(true) - int value
is.Type[string](value2): bool(false) - int value checked as string
is.Type[bool](value3): bool(true) - bool value

Zero

func Zero[T comparable](value T) bool

Zero checks if a value is zero.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/is"
)

func main() {
// Zero detects zero values of different types
fmt.Println("Checking zero values:")
fmt.Printf("is.Zero(0): %v (integer zero value)\n", is.Zero(0))
fmt.Printf("is.Zero(42): %v (non-zero integer)\n", is.Zero(42))
fmt.Printf("is.Zero(\"\"): %v (empty string)\n", is.Zero(""))
fmt.Printf("is.Zero(\"hello\"): %v (non-empty string)\n", is.Zero("hello"))

}

Output

Checking zero values:
is.Zero(0): true (integer zero value)
is.Zero(42): false (non-zero integer)
is.Zero(""): true (empty string)
is.Zero("hello"): false (non-empty string)