parent
a1839b4e1f
commit
321b4df295
@ -1,3 +1,3 @@
|
|||||||
module AATest
|
module test
|
||||||
|
|
||||||
go 1.22
|
go 1.22
|
||||||
|
|||||||
@ -0,0 +1,3 @@
|
|||||||
|
module apcks
|
||||||
|
|
||||||
|
go 1.22
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* ---------------------------------------------------------
|
||||||
|
* Project $PROJECT_NAME
|
||||||
|
* Active Thing (activething.com) git.activething.com/go
|
||||||
|
*
|
||||||
|
* File name $FILE_NAME
|
||||||
|
* Created by ${USER}
|
||||||
|
* Modified ${DAY}/${MONTH}/${YEAR}
|
||||||
|
*
|
||||||
|
* Copyright ${YEAR} activething.com
|
||||||
|
* ---------------------------------------------------------
|
||||||
|
* // Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* // you may not use this file except in compliance with the License.
|
||||||
|
* // You may obtain a copy of the License at
|
||||||
|
* //
|
||||||
|
* // http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* //
|
||||||
|
* // Unless required by applicable law or agreed to in writing, software
|
||||||
|
* // distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* // See the License for the specific language governing permissions and
|
||||||
|
* // limitations under the License.
|
||||||
|
* //
|
||||||
|
* /
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package bits
|
||||||
|
|
||||||
|
import "errs"
|
||||||
|
|
||||||
|
var (
|
||||||
|
|
||||||
|
G = struct {
|
||||||
|
|
||||||
|
ErrUnsupportedFlagType errs.ErrCode
|
||||||
|
}{
|
||||||
|
|
||||||
|
ErrUnsupportedFlagType : errs.ErrCode ("unsupported-bit-flag-type") ,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,97 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name bflag_16.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 15/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package bits
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math/bits"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
type BFlags16 uint16
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (f BFlags16) Has ( flag BFlags16) bool {
|
||||||
|
return f&flag != 0 }
|
||||||
|
|
||||||
|
|
||||||
|
func (f BFlags16) Add ( flag BFlags16) BFlags16 {
|
||||||
|
return f|flag }
|
||||||
|
|
||||||
|
|
||||||
|
func (f BFlags16) AddWithMask ( flag BFlags16, mask BFlags16) BFlags16 {
|
||||||
|
return (f&mask) | flag }
|
||||||
|
|
||||||
|
|
||||||
|
func (f BFlags16) Del ( flag BFlags16) BFlags16 {
|
||||||
|
return f&^flag }
|
||||||
|
|
||||||
|
|
||||||
|
func (f BFlags16) Invert () BFlags16 {
|
||||||
|
return ^f }
|
||||||
|
|
||||||
|
|
||||||
|
func (f BFlags16) Count() int {
|
||||||
|
return bits.OnesCount16(uint16(f)) }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (f BFlags16) Extract() []BFlags16 {
|
||||||
|
if f == 0 {
|
||||||
|
return []BFlags16{}
|
||||||
|
}
|
||||||
|
l := make([]BFlags16,0,16)
|
||||||
|
c := BFlags16(1)
|
||||||
|
for i:=1; i<= 7; i++ {
|
||||||
|
if c&f == c {
|
||||||
|
l = append(l,c)
|
||||||
|
}
|
||||||
|
c <<= 1
|
||||||
|
}
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (f BFlags16) FlagsToNames (namer func(flags BFlags16) string) []string {
|
||||||
|
if f == 0 {
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
l := make([]string,0,16)
|
||||||
|
c := BFlags16(1)
|
||||||
|
for i:=1; i<= 7; i++ {
|
||||||
|
if c&f == c {
|
||||||
|
l = append(l,namer(c))
|
||||||
|
}
|
||||||
|
c <<= 1
|
||||||
|
}
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (f BFlags16) NamesToFlags (names []string, flagger func(name string) BFlags16) BFlags16 {
|
||||||
|
for _,s := range names {
|
||||||
|
f|=flagger(s)
|
||||||
|
}
|
||||||
|
return f
|
||||||
|
}
|
||||||
@ -0,0 +1,106 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name bflag.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 15/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package bits
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/binary"
|
||||||
|
"math/bits"
|
||||||
|
"typs"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func Has [T typs.UnsignedAll](source T, flag T) bool {
|
||||||
|
return source&flag != 0 }
|
||||||
|
|
||||||
|
|
||||||
|
func Add [T typs.UnsignedAll](source T, flag T) T {
|
||||||
|
return source|flag }
|
||||||
|
|
||||||
|
|
||||||
|
func AddWithMask [T typs.UnsignedAll](source T, flag T, mask T) T {
|
||||||
|
return (source&mask) | flag }
|
||||||
|
|
||||||
|
|
||||||
|
func Del [T typs.UnsignedAll](source T, flag T) T {
|
||||||
|
return source&^flag }
|
||||||
|
|
||||||
|
|
||||||
|
func Invert [T typs.UnsignedAll](source T) T {
|
||||||
|
return ^source }
|
||||||
|
|
||||||
|
|
||||||
|
func Count[T typs.UnsignedAll](source T) int {
|
||||||
|
switch binary.Size(source) {
|
||||||
|
case 1 : return bits.OnesCount8 (uint8(source))
|
||||||
|
case 2 : return bits.OnesCount16(uint16(source))
|
||||||
|
case 4 : return bits.OnesCount32(uint32(source))
|
||||||
|
case 8 : return bits.OnesCount64(uint64(source))
|
||||||
|
default:
|
||||||
|
panic(G.ErrUnsupportedFlagType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func Extract[T typs.UnsignedAll](source T) []T {
|
||||||
|
if source == 0 {
|
||||||
|
return []T{}
|
||||||
|
}
|
||||||
|
l := make([]T,0,16)
|
||||||
|
c := T(1)
|
||||||
|
for i:=1; i<= 7; i++ {
|
||||||
|
if c&source == c {
|
||||||
|
l = append(l,c)
|
||||||
|
}
|
||||||
|
c <<= 1
|
||||||
|
}
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func FlagsToNames [T typs.UnsignedAll](source T, namer func(flags T) string) []string {
|
||||||
|
if source == 0 {
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
l := make([]string,0,16)
|
||||||
|
c := T(1)
|
||||||
|
for i:=1; i<= 7; i++ {
|
||||||
|
if c&source == c {
|
||||||
|
l = append(l,namer(c))
|
||||||
|
}
|
||||||
|
c <<= 1
|
||||||
|
}
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func NamesToFlags [T typs.UnsignedAll](names []string, flagger func(name string) T) T {
|
||||||
|
var f T
|
||||||
|
for _,s := range names {
|
||||||
|
f|=flagger(s)
|
||||||
|
}
|
||||||
|
return f
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
module bits
|
||||||
|
|
||||||
|
go 1.22
|
||||||
@ -0,0 +1,70 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name writer.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 23/04/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package base32
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/base32"
|
||||||
|
"mems"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Write(b *mems.ABuffer, value, null, empty []byte, isQuoted bool, quote byte) (er error) {
|
||||||
|
if value == nil {
|
||||||
|
_,_ = b.Write(null)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if len(value) == 0 {
|
||||||
|
_,_ = b.Write(empty)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
p := b.Len()
|
||||||
|
if isQuoted {
|
||||||
|
b.WriteByte(quote)
|
||||||
|
}
|
||||||
|
|
||||||
|
var t [64]byte
|
||||||
|
ln := base32.StdEncoding.EncodedLen(len(value))
|
||||||
|
if ln <= len(t) {
|
||||||
|
dst := t[:ln]
|
||||||
|
base32.StdEncoding.Encode(dst, value)
|
||||||
|
_,er = b.Write(dst)
|
||||||
|
} else if ln <= 1024 {
|
||||||
|
dst := make([]byte, ln)
|
||||||
|
base32.StdEncoding.Encode(dst, value)
|
||||||
|
_,er = b.Write(dst)
|
||||||
|
} else if er == nil {
|
||||||
|
ec := base32.NewEncoder(base32.StdEncoding, b)
|
||||||
|
_,_ = ec.Write(value)
|
||||||
|
return ec.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
if er == nil {
|
||||||
|
if isQuoted {
|
||||||
|
b.WriteByte(quote)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
b.Truncate(p)
|
||||||
|
}
|
||||||
|
return er
|
||||||
|
}
|
||||||
@ -0,0 +1,76 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name writer.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 23/04/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package base64
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/base64"
|
||||||
|
"mems"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func Write(b *mems.ABuffer, value, null, empty []byte, isQuoted bool, quote byte) (er error) {
|
||||||
|
if value == nil {
|
||||||
|
_,_ = b.Write(null)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if len(value) == 0 {
|
||||||
|
_,_ = b.Write(empty)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
p := b.Len()
|
||||||
|
if isQuoted {
|
||||||
|
b.WriteByte(quote)
|
||||||
|
}
|
||||||
|
|
||||||
|
var t [64]byte
|
||||||
|
ln := base64.StdEncoding.EncodedLen(len(value))
|
||||||
|
if ln <= len(t) {
|
||||||
|
dst := t[:ln]
|
||||||
|
base64.StdEncoding.Encode(dst, value)
|
||||||
|
_,er = b.Write(dst)
|
||||||
|
} else if ln <= 1024 {
|
||||||
|
dst := make([]byte, ln)
|
||||||
|
base64.StdEncoding.Encode(dst, value)
|
||||||
|
_,er = b.Write(dst)
|
||||||
|
} else if er == nil {
|
||||||
|
ec := base64.NewEncoder(base64.StdEncoding, b)
|
||||||
|
_,_ = ec.Write(value)
|
||||||
|
er = ec.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
if er == nil {
|
||||||
|
if isQuoted {
|
||||||
|
b.WriteByte(quote)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
b.Truncate(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
return er
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,73 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name active.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 21/04/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package cjson
|
||||||
|
|
||||||
|
import "unicode/utf8"
|
||||||
|
|
||||||
|
var (
|
||||||
|
|
||||||
|
G = struct {
|
||||||
|
Hex string
|
||||||
|
JSONChars [utf8.RuneSelf]CharAtt
|
||||||
|
|
||||||
|
NullValue []byte
|
||||||
|
EmptyValue []byte
|
||||||
|
ZeroValue []byte
|
||||||
|
TrueValue []byte
|
||||||
|
FalseValue []byte
|
||||||
|
|
||||||
|
FloatNaN []byte
|
||||||
|
FloatInfPos []byte
|
||||||
|
FloatInfNeg []byte
|
||||||
|
} {
|
||||||
|
|
||||||
|
Hex: "0123456789abcdef",
|
||||||
|
JSONChars: initJSONChars(),
|
||||||
|
|
||||||
|
NullValue: []byte{'n', 'u', 'l', 'l'},
|
||||||
|
ZeroValue: []byte{'0'},
|
||||||
|
EmptyValue: []byte{'"','"'},
|
||||||
|
TrueValue: []byte{'"','t', 'r', 'u', 'e','"'},
|
||||||
|
FalseValue: []byte{'"','f', 'a', 'l', 's', 'e','"'},
|
||||||
|
|
||||||
|
FloatNaN: []byte{'"', 'N', 'a', 'N', '"'},
|
||||||
|
FloatInfPos: []byte{'"', 'I', 'n', 'f', '"'},
|
||||||
|
FloatInfNeg: []byte{'"', '-', 'I', 'n', 'f', '"'},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func initJSONChars() [utf8.RuneSelf]CharAtt {
|
||||||
|
var tb = [utf8.RuneSelf]CharAtt{
|
||||||
|
'"': CharAttAllUnsafe,
|
||||||
|
'&': CharAttHtmlUnsafe,
|
||||||
|
'<': CharAttHtmlUnsafe,
|
||||||
|
'>': CharAttHtmlUnsafe,
|
||||||
|
'\\': CharAttAllUnsafe,
|
||||||
|
}
|
||||||
|
for i := 0; i <= 31; i++ {
|
||||||
|
tb[i] = CharAttAllUnsafe
|
||||||
|
}
|
||||||
|
return tb
|
||||||
|
}
|
||||||
@ -0,0 +1,45 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name char_att.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 21/04/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package cjson
|
||||||
|
|
||||||
|
|
||||||
|
const (
|
||||||
|
CharAttUnsafe CharAtt = 1 << iota
|
||||||
|
CharAttHtmlUnsafe
|
||||||
|
|
||||||
|
CharAttAllUnsafe = CharAttUnsafe | CharAttHtmlUnsafe
|
||||||
|
)
|
||||||
|
|
||||||
|
type CharAtt uint8
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (a CharAtt) IsUnsafe() bool {
|
||||||
|
return a&CharAttUnsafe != 0 }
|
||||||
|
|
||||||
|
func (a CharAtt) IsHtmlUnsafe() bool {
|
||||||
|
return a&CharAttHtmlUnsafe != 0 }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,193 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name writer.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 21/04/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package cjson
|
||||||
|
|
||||||
|
import (
|
||||||
|
"codecs/base32"
|
||||||
|
"codecs/base64"
|
||||||
|
"math"
|
||||||
|
"mems"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
"unicode/utf8"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func WriteString(b *mems.ABuffer, value string, escapeHTML bool ) {
|
||||||
|
if len(value) == 0 {
|
||||||
|
b.Write2Byte('"', '"')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
b.WriteByte('"')
|
||||||
|
start := 0
|
||||||
|
for i := 0; i < len(value); {
|
||||||
|
if ch := value[i]; ch < utf8.RuneSelf {
|
||||||
|
|
||||||
|
if !G.JSONChars[ch].IsHtmlUnsafe() || (!escapeHTML && !G.JSONChars[ch].IsUnsafe()) {
|
||||||
|
i++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if start < i {
|
||||||
|
b.WriteString(value[start:i])
|
||||||
|
}
|
||||||
|
b.WriteByte('\\')
|
||||||
|
switch ch {
|
||||||
|
case '\\', '"':
|
||||||
|
b.WriteByte(ch)
|
||||||
|
case '\n':
|
||||||
|
b.WriteByte('n')
|
||||||
|
case '\r':
|
||||||
|
b.WriteByte('r')
|
||||||
|
case '\t':
|
||||||
|
b.WriteByte('t')
|
||||||
|
default:
|
||||||
|
b.WriteString(`u00`)
|
||||||
|
b.Write2Byte(G.Hex[ch>>4], G.Hex[ch&0xF])
|
||||||
|
}
|
||||||
|
i++
|
||||||
|
start = i
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
c, size := utf8.DecodeRuneInString(value[i:])
|
||||||
|
if c == utf8.RuneError && size == 1 {
|
||||||
|
if start < i {
|
||||||
|
b.WriteString(value[start:i])
|
||||||
|
}
|
||||||
|
b.WriteString(`\ufffd`)
|
||||||
|
i += size
|
||||||
|
start = i
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if c == '\u2028' || c == '\u2029' {
|
||||||
|
if start < i {
|
||||||
|
b.WriteString(value[start:i])
|
||||||
|
}
|
||||||
|
b.WriteString(`\u202`)
|
||||||
|
b.WriteByte(G.Hex[c&0xF])
|
||||||
|
i += size
|
||||||
|
start = i
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
i += size
|
||||||
|
}
|
||||||
|
if start < len(value) {
|
||||||
|
b.WriteString(value[start:])
|
||||||
|
}
|
||||||
|
b.WriteByte('"')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func WriteUint (b *mems.ABuffer, value uint64 , quoted bool) {
|
||||||
|
if quoted {
|
||||||
|
b.WriteByte('"')
|
||||||
|
}
|
||||||
|
if value == 0 {
|
||||||
|
b.WriteByte('0')
|
||||||
|
} else {
|
||||||
|
b.WriteUIntStr(value, 10)
|
||||||
|
}
|
||||||
|
if quoted {
|
||||||
|
b.WriteByte('"')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func WriteBool (b *mems.ABuffer, value bool , quoted bool) {
|
||||||
|
if value {
|
||||||
|
b.WOQ(quoted,'"', G.TrueValue)
|
||||||
|
} else {
|
||||||
|
b.WOQ(quoted,'"', G.FalseValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func WriteInt (b *mems.ABuffer, value int64 , quoted bool) {
|
||||||
|
if quoted {
|
||||||
|
b.WriteByte('"')
|
||||||
|
}
|
||||||
|
if value == 0 {
|
||||||
|
b.WriteByte('0')
|
||||||
|
} else {
|
||||||
|
b.WriteIntStr(value, 10)
|
||||||
|
}
|
||||||
|
if quoted {
|
||||||
|
b.WriteByte('"')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func WriteFloat (b *mems.ABuffer, f float64, bits int, quoted bool) {
|
||||||
|
var t [64]byte
|
||||||
|
if math.IsInf(f, 0) || math.IsNaN(f) {
|
||||||
|
_,_ = b.Write(G.FloatNaN)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
abs := math.Abs(f)
|
||||||
|
fm := byte('f')
|
||||||
|
|
||||||
|
if abs != 0 {
|
||||||
|
if bits == 64 && (abs < 1e-6 || abs >= 1e21) || bits == 32 && (float32(abs) < 1e-6 || float32(abs) >= 1e21) {
|
||||||
|
fm = 'e'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bf := t[:0]
|
||||||
|
bf = strconv.AppendFloat(bf, f, fm, -1, int(bits))
|
||||||
|
if fm == 'e' {
|
||||||
|
// clean up e-09 to e-9
|
||||||
|
n := len(bf)
|
||||||
|
if n >= 4 && bf[n-4] == 'e' && bf[n-3] == '-' && bf[n-2] == '0' {
|
||||||
|
bf[n-2] = bf[n-1]
|
||||||
|
bf = bf[:n-1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
b.WOQ(quoted,'"',bf)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func WriteDate(b *mems.ABuffer, value time.Time, layout string, quote bool) {
|
||||||
|
if layout == "" {
|
||||||
|
layout = time.RFC3339
|
||||||
|
}
|
||||||
|
if quote {
|
||||||
|
b.WriteByte('"')
|
||||||
|
}
|
||||||
|
b.WriteDateStr(value,layout)
|
||||||
|
if quote {
|
||||||
|
b.WriteByte('"')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func WriteBase64(b *mems.ABuffer, value []byte) (er error) {
|
||||||
|
return base64.Write(b,value,G.NullValue,G.EmptyValue,true,'"') }
|
||||||
|
|
||||||
|
|
||||||
|
func WriteBase32(b *mems.ABuffer, value []byte) (er error) {
|
||||||
|
return base32.Write(b,value,G.NullValue,G.EmptyValue,true,'"') }
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
module cdcs
|
||||||
|
|
||||||
|
go 1.22
|
||||||
@ -0,0 +1,66 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name rkey.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 05/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package crns
|
||||||
|
|
||||||
|
import "errs"
|
||||||
|
|
||||||
|
var (
|
||||||
|
|
||||||
|
|
||||||
|
G = struct {
|
||||||
|
ErrExpired errs.ErrCode
|
||||||
|
ErrTimeout errs.ErrCode
|
||||||
|
ErrIntervalInvalid errs.ErrCode
|
||||||
|
ErrNotStarted errs.ErrCode
|
||||||
|
ErrNotPaused errs.ErrCode
|
||||||
|
ErrAlreadyStarted errs.ErrCode
|
||||||
|
ErrTransitionInvalid errs.ErrCode
|
||||||
|
ErrTimerTaskInvalid errs.ErrCode
|
||||||
|
} {
|
||||||
|
|
||||||
|
ErrExpired: errs.ErrCode("expired"),
|
||||||
|
ErrTimeout: errs.ErrCode("timeout"),
|
||||||
|
ErrIntervalInvalid: errs.ErrCode("interval_invalid"),
|
||||||
|
ErrNotStarted: errs.ErrCode("not_started"),
|
||||||
|
ErrNotPaused: errs.ErrCode("not_paused"),
|
||||||
|
ErrAlreadyStarted: errs.ErrCode("already_started"),
|
||||||
|
ErrTransitionInvalid: errs.ErrCode("transition_invalid"),
|
||||||
|
ErrTimerTaskInvalid: errs.ErrCode("timer_task_invalid"),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,108 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name rkey.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 05/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package crns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
Chrono struct {
|
||||||
|
started int64
|
||||||
|
stopped int64
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func NewChrono(str bool) *Chrono {
|
||||||
|
ch := &Chrono{}
|
||||||
|
if str {
|
||||||
|
ch.Start()
|
||||||
|
}
|
||||||
|
return ch
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Chrono) Started() time.Time {
|
||||||
|
return time.Unix(0,atomic.LoadInt64(&c.started)) }
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Chrono) Stopped() time.Time {
|
||||||
|
return time.Unix(0,atomic.LoadInt64(&c.stopped)) }
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Chrono) Elapsed() time.Duration {
|
||||||
|
st := atomic.LoadInt64(&c.started)
|
||||||
|
if st == 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
sp := atomic.LoadInt64(&c.stopped)
|
||||||
|
if sp == 0 {
|
||||||
|
return time.Now().Sub(time.Unix(0, int64(st)))
|
||||||
|
}
|
||||||
|
return time.Duration(sp - st)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Chrono) Reset() {
|
||||||
|
atomic.StoreInt64(&c.started,0)
|
||||||
|
atomic.StoreInt64(&c.stopped,0)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Chrono) Start() (tm time.Time) {
|
||||||
|
tm = time.Now()
|
||||||
|
atomic.CompareAndSwapInt64(&c.started,0,tm.UnixNano())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Chrono) Stop() (tm time.Time) {
|
||||||
|
tm = time.Now()
|
||||||
|
atomic.CompareAndSwapInt64(&c.stopped,0,tm.UnixNano())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Chrono) SetTimes(str, stp time.Time) {
|
||||||
|
atomic.StoreInt64(&c.started,str.UnixNano())
|
||||||
|
atomic.StoreInt64(&c.stopped,str.UnixNano())
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,59 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name rkey.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 05/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
package crns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
Chronometer interface {
|
||||||
|
|
||||||
|
Started() time.Time
|
||||||
|
|
||||||
|
Stopped() time.Time
|
||||||
|
|
||||||
|
Elapsed() time.Duration
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,182 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name rkey.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 05/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package crns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
Expiration struct {
|
||||||
|
timer *time.Timer
|
||||||
|
times Chrono
|
||||||
|
|
||||||
|
state uint32
|
||||||
|
source uint32
|
||||||
|
timeout int64
|
||||||
|
deadline int64
|
||||||
|
|
||||||
|
expireFn func()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func NewExpiration(duration time.Duration, expirer func()) *Expiration {
|
||||||
|
ex := &Expiration{
|
||||||
|
times: *NewChrono(false),
|
||||||
|
state: uint32(TimerStateCreated),
|
||||||
|
source: uint32(ExpirationSourceSelf),
|
||||||
|
timeout: int64(duration),
|
||||||
|
expireFn: expirer,
|
||||||
|
}
|
||||||
|
if duration > 0 {
|
||||||
|
atomic.StoreUint32(&ex.source,uint32(ExpirationSourceTimer))
|
||||||
|
}
|
||||||
|
return ex
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (e *Expiration) Reset() {
|
||||||
|
e.times.Reset()
|
||||||
|
atomic.StoreUint32(&e.state ,uint32(TimerStateCreated))
|
||||||
|
atomic.StoreUint32(&e.source,uint32(ExpirationSourceSelf))
|
||||||
|
atomic.StoreInt64 (&e.timeout ,0)
|
||||||
|
atomic.StoreInt64 (&e.deadline,0)
|
||||||
|
if e.timer != nil {
|
||||||
|
if !e.timer.Stop() {
|
||||||
|
select {
|
||||||
|
case <- e.timer.C:
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (e *Expiration) State() TimerState {
|
||||||
|
return TimerState(atomic.LoadUint32(&e.state)) }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (e *Expiration) Chono() Chronometer {
|
||||||
|
return &e.times }
|
||||||
|
|
||||||
|
|
||||||
|
func (e *Expiration) Source() ExpirationSource {
|
||||||
|
return ExpirationSource(atomic.LoadUint32(&e.source)) }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (e *Expiration) Timeout() time.Duration {
|
||||||
|
return time.Duration(atomic.LoadInt64(&e.timeout)) }
|
||||||
|
|
||||||
|
|
||||||
|
func (e *Expiration) Deadline() time.Time {
|
||||||
|
return time.Unix(0,atomic.LoadInt64(&e.deadline)) }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (e *Expiration) Start(expirer Expirer) error {
|
||||||
|
if !atomic.CompareAndSwapUint32(&e.state,uint32(TimerStateCreated),uint32(TimerStateStarted)) {
|
||||||
|
return G.ErrAlreadyStarted
|
||||||
|
}
|
||||||
|
|
||||||
|
st := e.times.Start()
|
||||||
|
to := time.Duration(atomic.LoadInt64(&e.timeout))
|
||||||
|
dl := st.Add(to)
|
||||||
|
|
||||||
|
if expirer != nil {
|
||||||
|
pd, ph := expirer.Deadline()
|
||||||
|
if ph {
|
||||||
|
if pd.Before(st) {
|
||||||
|
atomic.StoreUint32(&e.state ,uint32(TimerStateExpired))
|
||||||
|
atomic.StoreUint32(&e.source,uint32(ExpirationSourceParent))
|
||||||
|
return G.ErrExpired
|
||||||
|
}
|
||||||
|
if pd.Before(dl) {
|
||||||
|
atomic.StoreInt64 (&e.deadline,pd.UnixNano())
|
||||||
|
atomic.StoreUint32(&e.source ,uint32(ExpirationSourceParent))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if atomic.LoadUint32(&e.source) == uint32(ExpirationSourceTimer) {
|
||||||
|
atomic.StoreInt64 (&e.deadline,dl.UnixNano())
|
||||||
|
if e.timer == nil {
|
||||||
|
e.timer = time.NewTimer(to)
|
||||||
|
} else {
|
||||||
|
e.timer.Reset(to)
|
||||||
|
}
|
||||||
|
go func(ex *Expiration) {
|
||||||
|
select {
|
||||||
|
case <-ex.timer.C:
|
||||||
|
atomic.StoreUint32(&ex.state,uint32(TimerStateExpired))
|
||||||
|
ex.times.Stop()
|
||||||
|
if ex.expireFn != nil {
|
||||||
|
ex.expireFn()
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}(e)
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (e *Expiration) Stop() error {
|
||||||
|
if !atomic.CompareAndSwapUint32(&e.state,uint32(TimerStateStarted), uint32(TimerStateStopped)) {
|
||||||
|
return G.ErrNotStarted
|
||||||
|
}
|
||||||
|
e.times.Stop()
|
||||||
|
if e.timer != nil && !e.timer.Stop() {
|
||||||
|
select {
|
||||||
|
case <-e.timer.C:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,62 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name rkey.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 05/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package crns
|
||||||
|
|
||||||
|
const (
|
||||||
|
|
||||||
|
//ExpirationSource
|
||||||
|
|
||||||
|
ExpirationSourceSelf ExpirationSource = iota
|
||||||
|
ExpirationSourceParent
|
||||||
|
ExpirationSourceTimer
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
ExpirationSource uint32
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func (c ExpirationSource) String() string {
|
||||||
|
switch c {
|
||||||
|
case ExpirationSourceSelf : return "self"
|
||||||
|
case ExpirationSourceParent : return "parent"
|
||||||
|
case ExpirationSourceTimer : return "timer"
|
||||||
|
default:
|
||||||
|
return "unknown"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,57 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name rkey.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 05/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package crns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
Expirer interface {
|
||||||
|
|
||||||
|
Deadline() (time.Time, bool)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DeadlineFnc func() (time.Time, bool)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func (f DeadlineFnc) Deadline() (time.Time, bool) {
|
||||||
|
return f() }
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,4 @@
|
|||||||
|
module crns
|
||||||
|
|
||||||
|
|
||||||
|
go 1.20
|
||||||
@ -0,0 +1,169 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name rkey.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 05/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package crns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"ctxs"
|
||||||
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
Pulsar struct {
|
||||||
|
state uint32
|
||||||
|
pulse int64
|
||||||
|
err atomic.Value
|
||||||
|
cancel ctxs.Cancel
|
||||||
|
workFn PulsarWorkFnc
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PulsarWorkFnc func(ctx context.Context) error
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func NewPulsar(pulse time.Duration, work PulsarWorkFnc) *Pulsar {
|
||||||
|
return &Pulsar{
|
||||||
|
state: uint32(TimerStateCreated),
|
||||||
|
cancel: *ctxs.NewCancel(),
|
||||||
|
pulse: int64(pulse),
|
||||||
|
workFn: work,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (p *Pulsar) State() TimerState {
|
||||||
|
return TimerState(atomic.LoadUint32(&p.state)) }
|
||||||
|
|
||||||
|
|
||||||
|
func (p *Pulsar) Pulse() time.Duration {
|
||||||
|
return time.Duration(atomic.LoadInt64(&p.pulse)) }
|
||||||
|
|
||||||
|
|
||||||
|
func (p *Pulsar) Err() error {
|
||||||
|
if v := p.err.Load(); v != nil {
|
||||||
|
return v.(error)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (p *Pulsar) Start(ctx context.Context) error {
|
||||||
|
if !atomic.CompareAndSwapUint32(&p.state,uint32(TimerStateCreated),uint32(TimerStateStarted)) {
|
||||||
|
return G.ErrAlreadyStarted
|
||||||
|
}
|
||||||
|
to := atomic.LoadInt64(&p.pulse)
|
||||||
|
if to <= 0 {
|
||||||
|
atomic.StoreUint32(&p.state,uint32(TimerStateExpired))
|
||||||
|
return G.ErrIntervalInvalid
|
||||||
|
}
|
||||||
|
|
||||||
|
cx := ctx
|
||||||
|
if cx == nil {
|
||||||
|
cx = context.Background()
|
||||||
|
} else if ctx.Err() != nil {
|
||||||
|
atomic.StoreUint32(&p.state,uint32(TimerStateCanceled))
|
||||||
|
return context.Canceled
|
||||||
|
}
|
||||||
|
|
||||||
|
go func(pl *Pulsar, tk *time.Ticker, cx context.Context) {
|
||||||
|
EXIT:
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-cx.Done():
|
||||||
|
atomic.StoreUint32(&pl.state,uint32(TimerStateCanceled))
|
||||||
|
break EXIT
|
||||||
|
|
||||||
|
case <-pl.cancel.Done():
|
||||||
|
break EXIT
|
||||||
|
|
||||||
|
case <-tk.C:
|
||||||
|
if TimerState(atomic.LoadUint32(&pl.state)) == TimerStateStarted {
|
||||||
|
if er := pl.workFn(cx); er != nil {
|
||||||
|
pl.err.Store(er)
|
||||||
|
atomic.StoreUint32(&pl.state,uint32(TimerStateCanceled))
|
||||||
|
break EXIT
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tk.Stop()
|
||||||
|
pl.cancel.Cancel()
|
||||||
|
|
||||||
|
}(p, time.NewTicker(time.Duration(to)), cx)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (p *Pulsar) Stop() error {
|
||||||
|
if atomic.CompareAndSwapUint32(&p.state,uint32(TimerStateStarted), uint32(TimerStateStopped)) ||
|
||||||
|
atomic.CompareAndSwapUint32(&p.state,uint32(TimerStatePaused), uint32(TimerStateStopped)) {
|
||||||
|
p.cancel.Cancel()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return G.ErrNotStarted
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (p *Pulsar) Pause() error {
|
||||||
|
if atomic.CompareAndSwapUint32(&p.state,uint32(TimerStateStarted), uint32(TimerStatePaused)) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return G.ErrNotStarted
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (p *Pulsar) Continue() error {
|
||||||
|
if atomic.CompareAndSwapUint32(&p.state,uint32(TimerStatePaused), uint32(TimerStateStarted)) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return G.ErrNotPaused
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (p *Pulsar) Done() <-chan struct{} {
|
||||||
|
return p.cancel.Done() }
|
||||||
|
|
||||||
|
|
||||||
|
func (p *Pulsar) Wait() {
|
||||||
|
<-p.cancel.Done() }
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,48 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name rkey.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 05/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package crns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
TimeTaskFnc func(now time.Time, ctx context.Context)
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,188 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name rkey.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 05/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package crns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"container/heap"
|
||||||
|
"context"
|
||||||
|
"opts"
|
||||||
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
timerQueueLen = 4096
|
||||||
|
timerQueueTime = time.Hour * 86400
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
TimerQueue struct {
|
||||||
|
heap TimerTaskHeap
|
||||||
|
state uint32
|
||||||
|
|
||||||
|
pushCh chan *TimerTask
|
||||||
|
ctx context.Context
|
||||||
|
ctxCancelFn context.CancelFunc
|
||||||
|
|
||||||
|
nextTask *time.Time
|
||||||
|
timer *time.Timer
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func NewTimerQueue(options ... opts.GOptionFnc[TimerQueue]) *TimerQueue {
|
||||||
|
tq := &TimerQueue{
|
||||||
|
heap : TimerTaskHeap{},
|
||||||
|
state: uint32(TimerStateCreated),
|
||||||
|
}
|
||||||
|
heap.Init(&tq.heap)
|
||||||
|
opts.GApply(tq, options ...)
|
||||||
|
if tq.pushCh == nil {
|
||||||
|
tq.pushCh = make(chan *TimerTask, timerQueueLen)
|
||||||
|
}
|
||||||
|
return tq
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (q *TimerQueue) State() TimerState {
|
||||||
|
return TimerState(atomic.LoadUint32(&q.state)) }
|
||||||
|
|
||||||
|
|
||||||
|
func (q *TimerQueue) Start(ctx context.Context) error {
|
||||||
|
if !atomic.CompareAndSwapUint32(&q.state,uint32(TimerStateCreated),uint32(TimerStateStarted)) {
|
||||||
|
// error already started
|
||||||
|
return G.ErrAlreadyStarted
|
||||||
|
}
|
||||||
|
if q.timer == nil {
|
||||||
|
q.timer = time.NewTimer(timerQueueTime)
|
||||||
|
} else {
|
||||||
|
q.timer.Reset(timerQueueTime)
|
||||||
|
}
|
||||||
|
|
||||||
|
q.ctx, q.ctxCancelFn = context.WithCancel(ctx)
|
||||||
|
go func(qu *TimerQueue, cx context.Context) {
|
||||||
|
ts := make([]*TimerTask, 0, 10)
|
||||||
|
EXIT:
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
//--
|
||||||
|
case <-cx.Done():
|
||||||
|
atomic.CompareAndSwapUint32(&qu.state,uint32(TimerStateStarted),uint32(TimerStateCanceled))
|
||||||
|
break EXIT
|
||||||
|
//--
|
||||||
|
case nw := <-qu.timer.C:
|
||||||
|
ts = ts[:0]
|
||||||
|
for ix, ln := 0, qu.heap.Len(); ix < ln; ix++ {
|
||||||
|
pk := qu.heap[0]
|
||||||
|
if pk.RunAt.Before(nw) {
|
||||||
|
pp := heap.Pop(&qu.heap).(*TimerTask)
|
||||||
|
ts = append(ts, pp)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ts) > 0 {
|
||||||
|
go func(tm time.Time, tk []*TimerTask) {
|
||||||
|
for _, tt := range tk {
|
||||||
|
tt.TaskFn(tm, ctx)
|
||||||
|
}
|
||||||
|
}(nw, ts)
|
||||||
|
}
|
||||||
|
|
||||||
|
if qu.heap.Len() > 0 {
|
||||||
|
nr := qu.heap[0].RunAt
|
||||||
|
qu.nextTask = &nr
|
||||||
|
qu.timer.Reset(nr.Sub(time.Now()))
|
||||||
|
} else {
|
||||||
|
qu.timer.Stop()
|
||||||
|
qu.nextTask = nil
|
||||||
|
}
|
||||||
|
//--
|
||||||
|
case tt := <-q.pushCh:
|
||||||
|
heap.Push(&q.heap, tt)
|
||||||
|
if qu.nextTask == nil || qu.nextTask.After(tt.RunAt) {
|
||||||
|
if qu.nextTask != nil && !qu.timer.Stop() {
|
||||||
|
<-qu.timer.C
|
||||||
|
}
|
||||||
|
qu.timer.Reset(tt.RunAt.Sub(time.Now()))
|
||||||
|
qu.nextTask = &tt.RunAt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !q.timer.Stop() {
|
||||||
|
<-qu.timer.C
|
||||||
|
}
|
||||||
|
qu.heap.Reset()
|
||||||
|
|
||||||
|
}(q, q.ctx)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (q *TimerQueue) Stop() error {
|
||||||
|
if atomic.CompareAndSwapUint32(&q.state,uint32(TimerStateStarted),uint32(TimerStateCanceled)) {
|
||||||
|
q.ctxCancelFn()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return G.ErrNotStarted
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (q *TimerQueue) Push(runAt time.Time, task TimeTaskFnc) error {
|
||||||
|
switch {
|
||||||
|
case runAt.Before(time.Now()):
|
||||||
|
return G.ErrExpired
|
||||||
|
case task == nil:
|
||||||
|
return G.ErrTimerTaskInvalid
|
||||||
|
case TimerState(atomic.LoadUint32(&q.state)) != TimerStateStarted:
|
||||||
|
return G.ErrNotStarted
|
||||||
|
default:
|
||||||
|
select {
|
||||||
|
case q.pushCh <- NewTimerTask(runAt, task):
|
||||||
|
return nil
|
||||||
|
case <-q.ctx.Done():
|
||||||
|
return context.Canceled
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,81 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name rkey.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 05/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package crns
|
||||||
|
|
||||||
|
const (
|
||||||
|
|
||||||
|
//Enum values for TimerState
|
||||||
|
TimerStateCreated TimerState = 1 << iota
|
||||||
|
TimerStateStarted
|
||||||
|
TimerStatePaused
|
||||||
|
TimerStateExpired
|
||||||
|
TimerStateStopped
|
||||||
|
TimerStateCanceled
|
||||||
|
|
||||||
|
timerStateActive = TimerStateStarted + TimerStatePaused
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
TimerState uint32
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (t TimerState) String() string {
|
||||||
|
switch t {
|
||||||
|
case TimerStateCreated:
|
||||||
|
return "created"
|
||||||
|
case TimerStateStarted:
|
||||||
|
return "started"
|
||||||
|
case TimerStatePaused:
|
||||||
|
return "paused"
|
||||||
|
case TimerStateExpired:
|
||||||
|
return "expired"
|
||||||
|
case TimerStateStopped:
|
||||||
|
return "stopped"
|
||||||
|
case TimerStateCanceled:
|
||||||
|
return "canceled"
|
||||||
|
default:
|
||||||
|
return "unknown"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (t TimerState) IsActive() bool {
|
||||||
|
return t != timerStateActive }
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,60 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name rkey.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 05/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
package crns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
TimerTask struct {
|
||||||
|
|
||||||
|
RunAt time.Time
|
||||||
|
TaskFn TimeTaskFnc
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func NewTimerTask(runAt time.Time, task TimeTaskFnc) *TimerTask {
|
||||||
|
return &TimerTask{
|
||||||
|
RunAt: runAt,
|
||||||
|
TaskFn: task,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,89 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name rkey.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 05/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package crns
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
TimerTaskHeap []*TimerTask
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func (h *TimerTaskHeap) Reset() {
|
||||||
|
*h = (*h)[:0] }
|
||||||
|
|
||||||
|
|
||||||
|
func (h *TimerTaskHeap) PushTimerTask(ele *TimerTask) {
|
||||||
|
if ele != nil {
|
||||||
|
*h = append(*h, ele)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *TimerTaskHeap) PopTimerTask() *TimerTask {
|
||||||
|
th := *h
|
||||||
|
if ln := len(th); ln > 0 {
|
||||||
|
tt := th[ln-1]
|
||||||
|
*h = th[:ln-1]
|
||||||
|
return tt
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (h *TimerTaskHeap) Push(ele interface{}) {
|
||||||
|
h.PushTimerTask(ele.(*TimerTask)) }
|
||||||
|
|
||||||
|
|
||||||
|
func (h *TimerTaskHeap) Pop() interface{} {
|
||||||
|
return h.PopTimerTask() }
|
||||||
|
|
||||||
|
|
||||||
|
func (h TimerTaskHeap) Len() int {
|
||||||
|
return len(h) }
|
||||||
|
|
||||||
|
|
||||||
|
func (h TimerTaskHeap) Less(i, j int) bool {
|
||||||
|
return h[i].RunAt.Before(h[j].RunAt) }
|
||||||
|
|
||||||
|
|
||||||
|
func (h TimerTaskHeap) Swap(i, j int) {
|
||||||
|
h[i], h[j] = h[j], h[i] }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name gogo.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 16/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package crypts
|
||||||
|
|
||||||
|
import "errs"
|
||||||
|
|
||||||
|
var (
|
||||||
|
|
||||||
|
G = struct {
|
||||||
|
ErrNotImplemented errs.ErrCode
|
||||||
|
}{
|
||||||
|
ErrNotImplemented:errs.ErrCode("crypter-not-implemented"),
|
||||||
|
}
|
||||||
|
)
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name crypter.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 16/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package crypts
|
||||||
|
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
Crypter interface {
|
||||||
|
Encrypter
|
||||||
|
Decrypter
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,43 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name decrypter.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 16/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package crypts
|
||||||
|
|
||||||
|
import "results"
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
Decrypter interface {
|
||||||
|
Decrypt (data []byte) results.Bytes
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DecrypterNop struct {}
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (_ DecrypterNop) Decrypt (_ []byte) results.Bytes {
|
||||||
|
return results.MakeBytesError(G.ErrNotImplemented) }
|
||||||
|
|
||||||
@ -0,0 +1,42 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name encrypter.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 16/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package crypts
|
||||||
|
|
||||||
|
import "results"
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
Encrypter interface {
|
||||||
|
Encrypt (data []byte) results.Bytes
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
EncrypterNop struct {}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func (_ EncrypterNop) Encrypt (_ []byte) results.Bytes {
|
||||||
|
return results.MakeBytesError(G.ErrNotImplemented) }
|
||||||
@ -0,0 +1,4 @@
|
|||||||
|
module crps
|
||||||
|
|
||||||
|
|
||||||
|
go 1.20
|
||||||
@ -0,0 +1,76 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name rkey.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 05/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
package ctxs
|
||||||
|
|
||||||
|
import "sync/atomic"
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
Cancel struct {
|
||||||
|
active uint32
|
||||||
|
doneCh chan struct{}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func NewCancel() *Cancel {
|
||||||
|
return &Cancel{
|
||||||
|
active: 1,
|
||||||
|
doneCh: make(chan struct{}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Cancel) Cancel() {
|
||||||
|
if atomic.CompareAndSwapUint32(&c.active,1,0) {
|
||||||
|
close(c.doneCh)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Cancel) Done() <-chan struct{} {
|
||||||
|
return c.doneCh }
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Cancel) IsDone() bool {
|
||||||
|
return atomic.LoadUint32(&c.active) == 1 }
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Cancel) Wait() {
|
||||||
|
<-c.doneCh }
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
module ctxs
|
||||||
|
|
||||||
|
go 1.22
|
||||||
@ -0,0 +1,83 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name gogo.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 21/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package dates
|
||||||
|
|
||||||
|
import "errs"
|
||||||
|
|
||||||
|
const(
|
||||||
|
|
||||||
|
secondsDay = 24 * 60 * 60
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
var (
|
||||||
|
|
||||||
|
G = struct {
|
||||||
|
|
||||||
|
ErrInvalidDateRange errs.ErrCode
|
||||||
|
}{
|
||||||
|
|
||||||
|
ErrInvalidDateRange : errs.ErrCode ("invalid-date-range"),
|
||||||
|
}
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func IsYearLeap (year int) bool {
|
||||||
|
return year%4 == 0 && (year%100 != 0 || year%400 == 0) }
|
||||||
|
|
||||||
|
|
||||||
|
func DaysInYear (year int) int {
|
||||||
|
if IsYearLeap(year) {
|
||||||
|
return 366 }
|
||||||
|
return 365
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func DaysIn (year, month int) int {
|
||||||
|
if month <= 0 || month > 12 {
|
||||||
|
return 0 }
|
||||||
|
d := [12]int{ 31,28,31,30,31,30,31,30,31,30,31 }
|
||||||
|
if month == 2 && IsYearLeap(year) {
|
||||||
|
return 29 }
|
||||||
|
return d[month]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func DayOfWeek (year, month, day int) int {
|
||||||
|
if month < 3 {
|
||||||
|
month += 12
|
||||||
|
year--
|
||||||
|
}
|
||||||
|
J := year / 100
|
||||||
|
K := year % 100
|
||||||
|
h := (day + (13*(month+1))/5 + K + K/4 + J/4 + 5*J) % 7
|
||||||
|
if h <= 1 {
|
||||||
|
return h+6
|
||||||
|
}
|
||||||
|
return h-1
|
||||||
|
}
|
||||||
@ -0,0 +1,55 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name gogo.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 21/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package bdates
|
||||||
|
|
||||||
|
import "errs"
|
||||||
|
|
||||||
|
const(
|
||||||
|
|
||||||
|
minBYear int = 1900
|
||||||
|
maxBYear int = 2155
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
|
||||||
|
|
||||||
|
G = struct {
|
||||||
|
ErrInvalidDay Err
|
||||||
|
ErrInvalidMonth Err
|
||||||
|
ErrInvalidYear Err
|
||||||
|
}{
|
||||||
|
ErrInvalidDay : Err{errs.ErrCode("invalid-day")},
|
||||||
|
ErrInvalidMonth : Err{errs.ErrCode("invalid-month")},
|
||||||
|
ErrInvalidYear : Err{errs.ErrCode("invalid-year")},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func checkDayNumber (day int) bool {
|
||||||
|
return day >=1 && day <=7 }
|
||||||
|
|
||||||
|
|
||||||
|
func checkMonthNumber(month int) bool {
|
||||||
|
return month >=1 && month <=12 }
|
||||||
|
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name bmonth.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 21/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package bdates
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
BMonth uint32
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,125 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name bweek.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 21/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package bdates
|
||||||
|
|
||||||
|
import "math/bits"
|
||||||
|
|
||||||
|
const(
|
||||||
|
|
||||||
|
BWeekDaysMon BWeekDays = 1 << iota
|
||||||
|
BWeekDaysTue
|
||||||
|
BWeekDaysWed
|
||||||
|
BWeekDaysThu
|
||||||
|
BWeekDaysFri
|
||||||
|
BWeekDaysSat
|
||||||
|
BWeekDaysSun
|
||||||
|
|
||||||
|
_BWeekFlag
|
||||||
|
|
||||||
|
BWeekDaysAll = 0x1111111
|
||||||
|
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
// BWeekDays
|
||||||
|
// Type: uint8
|
||||||
|
// Desc: Representa una lista de los dias de la semana
|
||||||
|
// a través de un byte
|
||||||
|
BWeekDays uint8
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func (w BWeekDays) GetFlag() bool {
|
||||||
|
return w&_BWeekFlag==_BWeekFlag }
|
||||||
|
|
||||||
|
|
||||||
|
func (w BWeekDays) SetFlag(val bool) BWeekDays {
|
||||||
|
if val {
|
||||||
|
return w|_BWeekFlag
|
||||||
|
}
|
||||||
|
return w&^_BWeekFlag
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (w BWeekDays) SetDay (num int, val bool) BWeekDays {
|
||||||
|
if num < 0 || num > 7 {
|
||||||
|
return w
|
||||||
|
}
|
||||||
|
if val {
|
||||||
|
w |= 1 << num-1
|
||||||
|
} else {
|
||||||
|
w &^= 1 << num-1
|
||||||
|
}
|
||||||
|
return w
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (w BWeekDays) GetDay (num int) bool {
|
||||||
|
if num < 0 || num > 7 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
c := BWeekDays(1 << num-1)
|
||||||
|
return (w&c)==c
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (w BWeekDays) Invert () BWeekDays {
|
||||||
|
return ^w }
|
||||||
|
|
||||||
|
|
||||||
|
func (w BWeekDays) Count () int {
|
||||||
|
return bits.OnesCount8(uint8(w)) }
|
||||||
|
|
||||||
|
|
||||||
|
func (w BWeekDays) List () []int {
|
||||||
|
c := BWeekDays(1)
|
||||||
|
r := make([]int,0,7)
|
||||||
|
for i:=1; i<=7; i++ {
|
||||||
|
if c&w == c {
|
||||||
|
r = append(r,i)
|
||||||
|
}
|
||||||
|
c <<=1
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (w BWeekDays) ToSlice () []bool {
|
||||||
|
c := BWeekDays(1)
|
||||||
|
r := make([]bool,7)
|
||||||
|
for i:=0; i<7; i++ {
|
||||||
|
r[i]=c&w == c
|
||||||
|
c <<=1
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (w BWeekDays) Common (dst BWeekDays) BWeekDays { return w & dst }
|
||||||
@ -0,0 +1,128 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name byear.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 21/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package bdates
|
||||||
|
|
||||||
|
import "times"
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
BYear struct {
|
||||||
|
atts BYearAtt
|
||||||
|
first byte
|
||||||
|
year byte
|
||||||
|
months [12]BMonth
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func NewBYear (year int) *BYear {
|
||||||
|
if year < minBYear || year > maxBYear {
|
||||||
|
panic(G.ErrInvalidYear)
|
||||||
|
}
|
||||||
|
at := BYearAtt(BYearAttSet)
|
||||||
|
if dates.IsYearLeap(year) {
|
||||||
|
at|=BYearAttLeap
|
||||||
|
}
|
||||||
|
return &BYear {
|
||||||
|
atts : at,
|
||||||
|
first: byte(dates.DayOfWeek(year,1,1)),
|
||||||
|
year : byte(year-1900),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (y *BYear) Atts () BYearAtt {
|
||||||
|
return y.atts }
|
||||||
|
|
||||||
|
func (y *BYear) First () int {
|
||||||
|
return int(y.first) }
|
||||||
|
|
||||||
|
func (y *BYear) Year () int {
|
||||||
|
return minBYear + int(y.year) }
|
||||||
|
|
||||||
|
|
||||||
|
func (y *BYear) Clear (month ...int) {
|
||||||
|
if len(month) == 0 {
|
||||||
|
for i := 0; i < 12; i++ {
|
||||||
|
y.months[i] = 0
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _,i := range month {
|
||||||
|
if !checkMonthNumber(i){
|
||||||
|
panic(G.ErrInvalidMonth)
|
||||||
|
}
|
||||||
|
y.months[i]=0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (y *BYear) GetDay (month, day int) bool {
|
||||||
|
if !checkMonthNumber(month) {
|
||||||
|
panic(G.ErrInvalidMonth )
|
||||||
|
}
|
||||||
|
if day < 1 || day > y.daysInMonth(month) {
|
||||||
|
panic(G.ErrInvalidDay)
|
||||||
|
}
|
||||||
|
return (uint32(1 << day) & uint32(y.months[month])) != 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (y *BYear) SetDay (month, day int, active bool) {
|
||||||
|
if !checkMonthNumber(month) {
|
||||||
|
panic(G.ErrInvalidMonth )
|
||||||
|
}
|
||||||
|
if day < 1 || day > y.daysInMonth(month) {
|
||||||
|
panic(G.ErrInvalidDay)
|
||||||
|
}
|
||||||
|
month-=1
|
||||||
|
if active {
|
||||||
|
y.months[month] = y.months[month] | BMonth(1 << day)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
y.months[month] = y.months[month] &^ BMonth(1 << day)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (y *BYear) GetMonth (month int) BMonth {
|
||||||
|
if !checkMonthNumber(month) {
|
||||||
|
panic(G.ErrInvalidMonth)
|
||||||
|
}
|
||||||
|
return y.months[month-1]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (y BYear) daysInMonth (month int) int {
|
||||||
|
d := [12]int{ 31,28,31,30,31,30,31,30,31,30,31 }
|
||||||
|
if month == 2 && y.Atts().IsLeap() {
|
||||||
|
return 29
|
||||||
|
}
|
||||||
|
return d[month-1]
|
||||||
|
}
|
||||||
@ -0,0 +1,51 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name byear_att.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 21/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package bdates
|
||||||
|
|
||||||
|
|
||||||
|
const(
|
||||||
|
|
||||||
|
BYearAttSet BYearAtt = iota << 1
|
||||||
|
BYearAttLeap
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
type BYearAtt byte
|
||||||
|
|
||||||
|
|
||||||
|
func (a BYearAtt) IsSet () bool {
|
||||||
|
return a&BYearAttSet != 0 }
|
||||||
|
|
||||||
|
|
||||||
|
func (a BYearAtt) IsLeap () bool {
|
||||||
|
return a&BYearAttLeap != 0 }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,33 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name err_bdates.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/04/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package bdates
|
||||||
|
|
||||||
|
import "errs"
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
Err struct { errs.ErrCode }
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,102 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name days.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 21/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package dates
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
DateDays int32
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (d DateDays) AddDate(years, months, days int) DateDays {
|
||||||
|
return TimeToDays(d.ToTime().AddDate(years,months,days)) }
|
||||||
|
|
||||||
|
|
||||||
|
func (d DateDays) ToTime() time.Time {
|
||||||
|
return DaysToTime(d) }
|
||||||
|
|
||||||
|
func (d DateDays) Before (days DateDays) bool {
|
||||||
|
return d < days }
|
||||||
|
|
||||||
|
func (d DateDays) After (days DateDays) bool {
|
||||||
|
return d > days }
|
||||||
|
|
||||||
|
func (d DateDays) Compare(days DateDays) int {
|
||||||
|
if d < days {
|
||||||
|
return -1 }
|
||||||
|
if d == days {
|
||||||
|
return 0 }
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d DateDays) Min (days DateDays) DateDays {
|
||||||
|
if d > days {
|
||||||
|
return days
|
||||||
|
}
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d DateDays) Max (days DateDays) DateDays {
|
||||||
|
if d < days {
|
||||||
|
return days
|
||||||
|
}
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func TimeToDays (time time.Time) DateDays {
|
||||||
|
_,x := time.Zone()
|
||||||
|
s := time.Unix() + int64(x)
|
||||||
|
if s >= 0 {
|
||||||
|
return DateDays(s/ secondsDay) }
|
||||||
|
return -DateDays((secondsDay -1 -s)/ secondsDay)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func DaysToTime(days DateDays) time.Time {
|
||||||
|
return time.Unix(int64(days) *secondsDay,0).UTC() }
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,94 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name date_days_range.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 21/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package dates
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
DateDaysRange struct {
|
||||||
|
Start DateDays
|
||||||
|
End DateDays
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DateDaysRangeFnc func(daysRange *DateDaysRange)
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewDateRange (options ...DateDaysRangeFnc) *DateDaysRange {
|
||||||
|
dr := &DateDaysRange{}
|
||||||
|
for _,o := range options {
|
||||||
|
o(dr)
|
||||||
|
}
|
||||||
|
return dr
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (r DateDaysRange) IsZero () bool {
|
||||||
|
return r.End-r.Start <= 0 }
|
||||||
|
|
||||||
|
|
||||||
|
func (r DateDaysRange) Size () DateDays {
|
||||||
|
return DateDays(r.End -r.Start) }
|
||||||
|
|
||||||
|
|
||||||
|
func (r DateDaysRange) Contains (days DateDays) bool {
|
||||||
|
if r.IsZero() {
|
||||||
|
return false }
|
||||||
|
return r.Start < days && r.End > days
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (r DateDaysRange) ContainsRange (drange DateDaysRange) bool {
|
||||||
|
if r.IsZero() {
|
||||||
|
return false }
|
||||||
|
return r.Start > drange.Start && r.End < drange.End
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (r DateDaysRange) IsRangeOverlap (drange DateDaysRange) bool {
|
||||||
|
if r.IsZero() {
|
||||||
|
return false }
|
||||||
|
if r.Start == drange.Start || r.Start == drange.End || r.End == drange.End {
|
||||||
|
return true }
|
||||||
|
if r.Start > drange.Start {
|
||||||
|
return drange.End < r.End
|
||||||
|
}
|
||||||
|
return r.End > drange.Start
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,83 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name rkey.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 05/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
package dates
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
DurationFormatter interface {
|
||||||
|
|
||||||
|
FormatDuration (dur time.Duration, dst []byte) []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FormatDurationFnc func (dur time.Duration, dst []byte) []byte
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func (f FormatDurationFnc) FormatDuration (dur time.Duration, dst []byte) []byte {
|
||||||
|
return f(dur,dst) }
|
||||||
|
|
||||||
|
|
||||||
|
func WrapDurationFormatterQuoted (dfm DurationFormatter, qte byte) DurationFormatter {
|
||||||
|
return FormatDurationFnc(func(tme time.Duration, dst []byte) []byte {
|
||||||
|
dst = append(dst, qte)
|
||||||
|
dst = dfm.FormatDuration(tme, dst)
|
||||||
|
return append(dst, qte)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func DurationMillis (dur time.Duration, dst []byte) []byte {
|
||||||
|
return strconv.AppendFloat(dst, float64(dur)/float64(time.Millisecond), 'f', -1, 64) }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func DurationNanos(dur time.Duration, dst []byte) []byte {
|
||||||
|
return strconv.AppendInt(dst, int64(dur), 10) }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func DurationSecs(dur time.Duration, dst []byte) []byte {
|
||||||
|
return strconv.AppendFloat(dst, float64(dur)/float64(time.Second), 'f', -1, 64) }
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
module dtes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
go 1.20
|
||||||
@ -0,0 +1,145 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name rkey.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 05/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
package dates
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
TimeFormatter interface {
|
||||||
|
|
||||||
|
FormatTime (tme time.Time, dst []byte) []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FormatTimeFnc func (tme time.Time, dst []byte) []byte
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func (f FormatTimeFnc) FormatTime (tme time.Time, dst []byte) []byte {
|
||||||
|
return f(tme,dst) }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func WrapTimeFormatterQuoted (tmf TimeFormatter, qte byte) TimeFormatter {
|
||||||
|
return FormatTimeFnc(func(tme time.Time, dst []byte) []byte {
|
||||||
|
dst = append(dst, qte)
|
||||||
|
dst = tmf.FormatTime(tme, dst)
|
||||||
|
return append(dst, qte)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func TimeRFC3339Nano(tme time.Time, dst []byte) []byte {
|
||||||
|
return tme.AppendFormat(dst, time.RFC3339Nano) }
|
||||||
|
|
||||||
|
|
||||||
|
func TimeANSIC(tme time.Time, dst []byte) []byte {
|
||||||
|
return tme.AppendFormat(dst, time.ANSIC) }
|
||||||
|
|
||||||
|
|
||||||
|
func TimeUnixDate(tme time.Time, dst []byte) []byte {
|
||||||
|
return tme.AppendFormat(dst, time.UnixDate) }
|
||||||
|
|
||||||
|
|
||||||
|
func TimeRubyDate(tme time.Time, dst []byte) []byte {
|
||||||
|
return tme.AppendFormat(dst, time.RubyDate) }
|
||||||
|
|
||||||
|
|
||||||
|
func TimeRFC822(tme time.Time, dst []byte) []byte {
|
||||||
|
return tme.AppendFormat(dst, time.RFC822) }
|
||||||
|
|
||||||
|
|
||||||
|
func TimeRFC822Z(tme time.Time, dst []byte) []byte {
|
||||||
|
return tme.AppendFormat(dst, time.RFC822Z) }
|
||||||
|
|
||||||
|
|
||||||
|
func TimeRFC850(tme time.Time, dst []byte) []byte {
|
||||||
|
return tme.AppendFormat(dst, time.RFC850) }
|
||||||
|
|
||||||
|
|
||||||
|
func TimeRFC1123(tme time.Time, dst []byte) []byte {
|
||||||
|
return tme.AppendFormat(dst, time.RFC1123) }
|
||||||
|
|
||||||
|
|
||||||
|
func TimeRFC1123Z(tme time.Time, dst []byte) []byte {
|
||||||
|
return tme.AppendFormat(dst, time.RFC1123Z) }
|
||||||
|
|
||||||
|
|
||||||
|
func TimeRFC3339(tme time.Time, dst []byte) []byte {
|
||||||
|
return tme.AppendFormat(dst, time.RFC3339) }
|
||||||
|
|
||||||
|
|
||||||
|
func TimeKitchen(tme time.Time, dst []byte) []byte {
|
||||||
|
return tme.AppendFormat(dst, time.Kitchen) }
|
||||||
|
|
||||||
|
|
||||||
|
func TimeISO8601(tme time.Time, dst []byte) []byte {
|
||||||
|
return tme.AppendFormat(dst, "2006-01-02T15:04:05.000Z0700") }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func TimeEpoch(tme time.Time, dst []byte) []byte {
|
||||||
|
return strconv.AppendFloat(dst, float64(tme.UnixNano())/float64(time.Second), 'f', -1, 64) }
|
||||||
|
|
||||||
|
|
||||||
|
func TimeEpochMillis(tme time.Time, dst []byte) []byte {
|
||||||
|
return strconv.AppendFloat(dst, float64(tme.UnixNano())/float64(time.Millisecond), 'f', -1, 64) }
|
||||||
|
|
||||||
|
|
||||||
|
func TimeStamp(tme time.Time, dst []byte) []byte {
|
||||||
|
return tme.AppendFormat(dst, time.Stamp) }
|
||||||
|
|
||||||
|
|
||||||
|
func TimeStampMilli(tme time.Time, dst []byte) []byte {
|
||||||
|
return tme.AppendFormat(dst, time.StampMilli) }
|
||||||
|
|
||||||
|
|
||||||
|
func TimeStampMicro(tme time.Time, dst []byte) []byte {
|
||||||
|
return tme.AppendFormat(dst, time.StampMicro) }
|
||||||
|
|
||||||
|
|
||||||
|
func TimeStampNano(tme time.Time, dst []byte) []byte {
|
||||||
|
return tme.AppendFormat(dst, time.StampNano) }
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,140 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File n active.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 05/04/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package ansi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
const (
|
||||||
|
|
||||||
|
styleAttsStart Code = 1024
|
||||||
|
|
||||||
|
bgMask Code = 0b1111110000011111
|
||||||
|
fgMask Code = 0b1111111111100000
|
||||||
|
clMask Code = 0b0000001111111111
|
||||||
|
txMask Code = 0b1111110000000000
|
||||||
|
bgShift int = 5
|
||||||
|
stShift int = 10
|
||||||
|
styleNumOps int = 3
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
var (
|
||||||
|
|
||||||
|
g = struct {
|
||||||
|
beginEscIni []byte
|
||||||
|
beginEscEnd []byte
|
||||||
|
endEsc []byte
|
||||||
|
charsEscs []byte
|
||||||
|
endEscStr string
|
||||||
|
|
||||||
|
ics []struct { n []byte; f []byte; b []byte }
|
||||||
|
itx []struct { n []byte; s []byte }
|
||||||
|
}{
|
||||||
|
|
||||||
|
beginEscIni : []byte("\x1b["),
|
||||||
|
beginEscEnd : []byte{'m'},
|
||||||
|
endEsc : []byte("\x1b[0m"),
|
||||||
|
endEscStr : "\x1b[0m",
|
||||||
|
|
||||||
|
ics : []struct { n []byte; f []byte; b []byte } {
|
||||||
|
{[]byte("none"), []byte{},[]byte{}},
|
||||||
|
{[]byte("black"), []byte{'3','0'},[]byte{'4','0'}},
|
||||||
|
{[]byte("red"), []byte{'3','1'},[]byte{'4','1'}},
|
||||||
|
{[]byte("green"), []byte{'3','2'},[]byte{'4','2'}},
|
||||||
|
{[]byte("yellow"), []byte{'3','3'},[]byte{'4','3'}},
|
||||||
|
{[]byte("blue"), []byte{'3','4'},[]byte{'4','4'}},
|
||||||
|
{[]byte("magenta"), []byte{'3','5'},[]byte{'4','5'}},
|
||||||
|
{[]byte("cyan"), []byte{'3','6'},[]byte{'4','6'}},
|
||||||
|
{[]byte("white"), []byte{'3','7'},[]byte{'4','7'}},
|
||||||
|
{[]byte("hblack"), []byte{'9','0'},[]byte{'1','0','0'}},
|
||||||
|
{[]byte("hred"), []byte{'9','1'},[]byte{'1','0','1'}},
|
||||||
|
{[]byte("hgreen"), []byte{'9','2'},[]byte{'1','0','2'}},
|
||||||
|
{[]byte("hyellow"), []byte{'9','3'},[]byte{'1','0','3'}},
|
||||||
|
{[]byte("hblue"), []byte{'9','4'},[]byte{'1','0','4'}},
|
||||||
|
{[]byte("hmagent"), []byte{'9','5'},[]byte{'1','0','5'}},
|
||||||
|
{[]byte("hcyan"), []byte{'9','6'},[]byte{'1','0','6'}},
|
||||||
|
{[]byte("hwhite"), []byte{'9','7'},[]byte{'1','0','7'}},
|
||||||
|
{[]byte("default"), []byte{'3','7'},[]byte{'4','9'}},
|
||||||
|
},
|
||||||
|
|
||||||
|
itx : []struct { n []byte; s []byte }{
|
||||||
|
{[]byte("bold-on"), []byte{'1'}},
|
||||||
|
{[]byte("underline-on"), []byte{'4'}},
|
||||||
|
{[]byte("blink-on"), []byte{'5'}},
|
||||||
|
{[]byte("bold-off"), []byte{'2','2'}},
|
||||||
|
{[]byte("underline-off"),[]byte{'2','5'}},
|
||||||
|
{[]byte("blink-off"), []byte{'2','7'}},
|
||||||
|
},
|
||||||
|
|
||||||
|
charsEscs : genCharEscapes(),
|
||||||
|
}
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func genCharEscapes () []byte {
|
||||||
|
r := make([]byte,255)
|
||||||
|
r['@']=1
|
||||||
|
for i:=int('A'); i<=int('Z'); i++ {
|
||||||
|
r[i]=1
|
||||||
|
r[i+32]=1
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func Esc (code Code) string {
|
||||||
|
return code.Begin() }
|
||||||
|
|
||||||
|
func EscEnd () string {
|
||||||
|
return g.endEscStr }
|
||||||
|
|
||||||
|
|
||||||
|
func FilterEscapes (data []byte) []byte {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
|
||||||
|
for i := 0; i < len(data); {
|
||||||
|
if data[i] != 0x1b {
|
||||||
|
buf.WriteByte(data[i])
|
||||||
|
i++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// Si encuentra una secuencia de escape, salta hasta encontrar un carácter alfabético.
|
||||||
|
next := i + 1
|
||||||
|
for next < len(data) && g.charsEscs[data[next]] == 0 {
|
||||||
|
next++
|
||||||
|
}
|
||||||
|
i = next
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf.Bytes()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,256 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File n code.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 06/04/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package ansi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
Code uint16
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func (c Code) Atts () string {
|
||||||
|
if c == 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
var r []string
|
||||||
|
m := c & txMask
|
||||||
|
if m != 0 {
|
||||||
|
dc := styleAttsStart
|
||||||
|
for i:=0; i<6; i++ {
|
||||||
|
if m & dc != 0 {
|
||||||
|
r = append(r,string(g.itx[i].n))
|
||||||
|
}
|
||||||
|
dc <<= 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
r = append(r,strings.Join([]string{c.FgColor().Name(),c.BgColor().Name()},":"))
|
||||||
|
return strings.Join(r,";")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (c Code) Clear () Code {
|
||||||
|
return 0 }
|
||||||
|
|
||||||
|
func (c Code) ClearColor () Code {
|
||||||
|
return c & txMask
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Code) ClearText () Code {
|
||||||
|
return c & clMask
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (c Code) FgColor() Color {
|
||||||
|
return Color((c & clMask) & bgMask) }
|
||||||
|
|
||||||
|
func (c Code) SetFgColor(color Color) Code {
|
||||||
|
if !color.IsValid() {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
return (c & fgMask) | Code(color)&bgMask
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Code) ResetFgColor() Code {
|
||||||
|
return (c & fgMask) | Code(colorDefault)&bgMask
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (c Code) BgColor() Color {
|
||||||
|
return Color(((c & clMask) & fgMask) >> bgShift) }
|
||||||
|
|
||||||
|
func (c Code) SetBgColor(color Color) Code {
|
||||||
|
if !color.IsValid() {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
return (c & bgMask) | (Code(color)<<bgShift) &fgMask
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Code) ResetBgColor() Code {
|
||||||
|
return (c & bgMask) | (Code(colorDefault)<<bgShift) &fgMask
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (c Code) Style () Style {
|
||||||
|
return Style(c >> 10) }
|
||||||
|
|
||||||
|
|
||||||
|
func (c Code) SetStyle (sty Style) Code {
|
||||||
|
if !sty.IsValid() {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
v := Code(sty) << stShift
|
||||||
|
return ((((c &txMask) >>styleNumOps) &^ v) <<styleNumOps | v) | c &clMask
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Code) DelStyle (sty Style) Code {
|
||||||
|
if !sty.IsValid() {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
v := Code(sty) << (styleNumOps + stShift)
|
||||||
|
return ((((c &txMask) <<styleNumOps) &^ v) >>styleNumOps | v) | c &clMask
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (c Code) scapeStyle () []byte {
|
||||||
|
m := c & txMask
|
||||||
|
if m == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var r []byte
|
||||||
|
dc := styleAttsStart
|
||||||
|
for i:=0; i<6; i++ {
|
||||||
|
if m & dc != 0 {
|
||||||
|
if r != nil {
|
||||||
|
r = append(r,';')
|
||||||
|
} else {
|
||||||
|
r = append(r,'0',';')
|
||||||
|
}
|
||||||
|
r = append(r, g.itx[i].s...)
|
||||||
|
}
|
||||||
|
dc <<= 1
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (c Code) scapeColor () []byte {
|
||||||
|
m := c & clMask
|
||||||
|
if m == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var r []byte
|
||||||
|
f := m & bgMask
|
||||||
|
b := (m & fgMask) >> bgShift
|
||||||
|
if f != 0 {
|
||||||
|
r = append(r, g.ics[f].f...)
|
||||||
|
}
|
||||||
|
if b != 0 {
|
||||||
|
if f > 0 {
|
||||||
|
r=append(r,';')
|
||||||
|
}
|
||||||
|
r = append(r, g.ics[b].b...)
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (c Code) escape () []byte {
|
||||||
|
if c == 0 {
|
||||||
|
return []byte{'0'}
|
||||||
|
}
|
||||||
|
st := c.scapeStyle()
|
||||||
|
sc := c.scapeColor()
|
||||||
|
if len(sc) == 0 {
|
||||||
|
return st
|
||||||
|
}
|
||||||
|
if len(st) == 0 {
|
||||||
|
return sc
|
||||||
|
}
|
||||||
|
return append(st,append([]byte{';'},sc...)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (c Code) stringValues() string {
|
||||||
|
return string(c.escape()) }
|
||||||
|
|
||||||
|
|
||||||
|
func (c Code) Begin() string {
|
||||||
|
if c == 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
r := c.escape()
|
||||||
|
return string(append(g.beginEscIni, append(r, g.beginEscEnd...)...))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Code) End () string {
|
||||||
|
if c == 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return g.endEscStr
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (c Code) Errorf (format string, params ...any) error {
|
||||||
|
return fmt.Errorf(c.Sprintf(format,params...)) }
|
||||||
|
|
||||||
|
func (c Code) Fprint (writer io.Writer, format string, params ...any) (n int, e error) {
|
||||||
|
return fmt.Fprint(writer,c.Sprintf(format,params...)) }
|
||||||
|
|
||||||
|
func (c Code) Fprintln (writer io.Writer, format string, params ...any) (n int, e error) {
|
||||||
|
return fmt.Fprintln(writer,c.Sprintf(format,params...)) }
|
||||||
|
|
||||||
|
func (c Code) Print (input ...any) (n int, e error) {
|
||||||
|
return fmt.Print(c.wrap(input ...)) }
|
||||||
|
|
||||||
|
func (c Code) Printf (format string, params ...any) {
|
||||||
|
fmt.Printf(c.Sprintf(format,params...)) }
|
||||||
|
|
||||||
|
|
||||||
|
func (c Code) Sprint (format string, params ...any) string {
|
||||||
|
return fmt.Sprint(c.Sprintf(format,params...))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Code) Sprintf (format string, params ...any) string {
|
||||||
|
if len(format) == 0 && len(params) == 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
s := fmt.Sprintf(format,params...)
|
||||||
|
if c == 0 {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
return c.wrap(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Code) Sprintln(format string, params ...any) string {
|
||||||
|
return fmt.Sprintln(c.Sprintf(format,params...)) }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (c Code) wrap(str ...any) string {
|
||||||
|
b := bytes.Buffer{}
|
||||||
|
b.WriteString(c.Begin())
|
||||||
|
for _,s := range str {
|
||||||
|
b.WriteString(fmt.Sprint(s))
|
||||||
|
}
|
||||||
|
b.WriteString(g.endEscStr)
|
||||||
|
return b.String()
|
||||||
|
}
|
||||||
|
|
||||||
@ -0,0 +1,65 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File n code_color.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 06/04/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package ansi
|
||||||
|
|
||||||
|
|
||||||
|
const (
|
||||||
|
|
||||||
|
ColorNone Color = iota
|
||||||
|
ColorBlack
|
||||||
|
ColorRed
|
||||||
|
ColorGreen
|
||||||
|
ColorYellow
|
||||||
|
ColorBlue
|
||||||
|
ColorMagenta
|
||||||
|
ColorCyan
|
||||||
|
ColorWhite
|
||||||
|
ColorHBlack
|
||||||
|
ColorHRed
|
||||||
|
ColorHGreen
|
||||||
|
ColorHYellow
|
||||||
|
ColorHBlue
|
||||||
|
ColorHMagenta
|
||||||
|
ColorHCyan
|
||||||
|
ColorHWhite
|
||||||
|
colorDefault
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
Color uint8
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func (c Color) Name () string {
|
||||||
|
if c.IsValid() {
|
||||||
|
return string(g.ics[c].n)
|
||||||
|
}
|
||||||
|
return string(g.ics[0].n)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Color) IsValid () bool {
|
||||||
|
return c >= ColorNone && c <= colorDefault
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
module ansi
|
||||||
|
|
||||||
|
go 1.22
|
||||||
@ -0,0 +1,117 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File n non_colorable_writer.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 06/04/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package ansi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
NonEscapeWriter struct {
|
||||||
|
writer io.Writer
|
||||||
|
}
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func NewNonEscapeWriter(w io.Writer) *NonEscapeWriter {
|
||||||
|
return &NonEscapeWriter{ writer: w } }
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
func (w *NonEscapeWriter) Write(data []byte) (n int, e error) {
|
||||||
|
var pt bytes.ABuffer
|
||||||
|
var ef bool
|
||||||
|
|
||||||
|
for _, b := range data {
|
||||||
|
if b == 0x1b {
|
||||||
|
ef = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if ef && b == 0x5b {
|
||||||
|
ef = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if ef {
|
||||||
|
ef = g.charsEscs[b] == 1
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
pt.WriteByte(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, e = pt.WriteTo(w.writer)
|
||||||
|
if e != nil {
|
||||||
|
return n, e
|
||||||
|
}
|
||||||
|
|
||||||
|
return len(data), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
func (w *NonEscapeWriter) Write(data []byte) (n int, err error) {
|
||||||
|
er := bytes.NewReader(data)
|
||||||
|
var plaintext bytes.Buffer
|
||||||
|
loop:
|
||||||
|
for {
|
||||||
|
c1, err := er.ReadByte()
|
||||||
|
if err != nil {
|
||||||
|
plaintext.WriteTo(w.writer)
|
||||||
|
break loop
|
||||||
|
}
|
||||||
|
if c1 != 0x1b {
|
||||||
|
plaintext.WriteByte(c1)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
_, err = plaintext.WriteTo(w.writer)
|
||||||
|
if err != nil {
|
||||||
|
break loop
|
||||||
|
}
|
||||||
|
c2, err := er.ReadByte()
|
||||||
|
if err != nil {
|
||||||
|
break loop
|
||||||
|
}
|
||||||
|
if c2 != 0x5b {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
c, err := er.ReadByte()
|
||||||
|
if err != nil {
|
||||||
|
break loop
|
||||||
|
}
|
||||||
|
if g.charsEscs[c] == 1 {
|
||||||
|
//if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return len(data), nil
|
||||||
|
}
|
||||||
@ -0,0 +1,77 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name style.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 06/04/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package ansi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math/bits"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
|
||||||
|
|
||||||
|
StyleBold Style = 1 << iota
|
||||||
|
StyleUnderline
|
||||||
|
StyleBlink
|
||||||
|
|
||||||
|
StyleNone Style = 0
|
||||||
|
|
||||||
|
allStyles = StyleBold | StyleUnderline | StyleBlink
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
Style uint8
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func (s Style) Count () int {
|
||||||
|
return bits.OnesCount8(uint8(s)) }
|
||||||
|
|
||||||
|
func (s Style) IsValid () bool {
|
||||||
|
return s <= allStyles
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s Style) Name () string {
|
||||||
|
var r []string
|
||||||
|
for i:=0; i< styleNumOps; i++ {
|
||||||
|
|
||||||
|
}
|
||||||
|
return strings.Join(r,",")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (s Style) HasBold () bool {
|
||||||
|
return s&StyleBold != 0 }
|
||||||
|
|
||||||
|
func (s Style) HasUnderline () bool {
|
||||||
|
return s&StyleUnderline != 0 }
|
||||||
|
|
||||||
|
func (s Style) HasBlink () bool {
|
||||||
|
return s&StyleBlink != 0 }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,52 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name flusher.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 25/04/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package iosys
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
// Flusher
|
||||||
|
// Interface type
|
||||||
|
//
|
||||||
|
//
|
||||||
|
Flusher interface {
|
||||||
|
|
||||||
|
Flush() error
|
||||||
|
}
|
||||||
|
|
||||||
|
FlushFnc func() error
|
||||||
|
|
||||||
|
|
||||||
|
NopFlusher struct {}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func (f FlushFnc) Flush() error {
|
||||||
|
return f() }
|
||||||
|
|
||||||
|
|
||||||
|
func (_ NopFlusher) Flush() error {
|
||||||
|
return nil }
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
module iosys
|
||||||
|
|
||||||
|
go 1.22
|
||||||
@ -0,0 +1,53 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name writer_flusher.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 25/04/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package iosys
|
||||||
|
|
||||||
|
import "io"
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
WriterFlusher interface {
|
||||||
|
io.Writer
|
||||||
|
Flusher
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func AsWriterFlusher (writer io.Writer) WriterFlusher {
|
||||||
|
if writer == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if wf,is := writer.(WriterFlusher); is {
|
||||||
|
return wf
|
||||||
|
}
|
||||||
|
return struct {
|
||||||
|
io.Writer
|
||||||
|
Flusher
|
||||||
|
}{
|
||||||
|
Writer : writer,
|
||||||
|
Flusher: NopFlusher{},
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
---------------------------------------------------------
|
||||||
|
Project activething
|
||||||
|
Active Thing (activething.com) git.activething.com/go
|
||||||
|
|
||||||
|
File name option.go
|
||||||
|
Created by DEV
|
||||||
|
Modified 23/10/2023
|
||||||
|
|
||||||
|
Copyright 2023 activething.com
|
||||||
|
---------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
*/
|
||||||
|
|
||||||
|
package opts
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
// GOptionFnc
|
||||||
|
// es un tipo de función que se utiliza para configurar objetos en constructores,
|
||||||
|
// permitiendo evitar largas listas de parámetros y mantener el código limpio.
|
||||||
|
GOptionFnc[T any] func(obj *T)
|
||||||
|
|
||||||
|
// GOptionErrFnc
|
||||||
|
// es un tipo de función de opción que puede devolver un error, lo que lo hace
|
||||||
|
// adecuado para manejar configuraciones que pueden generar errores.
|
||||||
|
//
|
||||||
|
GOptionErrFnc[T any] func(obj *T) error
|
||||||
|
)
|
||||||
|
|
||||||
|
// GApply
|
||||||
|
// aplica una serie de funciones GOptionFnc a un objeto dado y lo retorna modificado.
|
||||||
|
func GApply[T any](target *T, options ...GOptionFnc[T]) *T {
|
||||||
|
if target == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
for _, fn := range options {
|
||||||
|
fn(target)
|
||||||
|
}
|
||||||
|
return target
|
||||||
|
}
|
||||||
|
|
||||||
|
// GApplyAndCheck
|
||||||
|
// aplica una serie de funciones GOptionErrFnc a un objeto y retorna el objeto modificado,
|
||||||
|
// junto con un posible error en caso de configuración incorrecta.
|
||||||
|
func GApplyAndCheck[T any](target *T, options ...GOptionErrFnc[T]) (*T, error) {
|
||||||
|
for _, fn := range options {
|
||||||
|
if err := fn(target); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return target, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GApplyAndCheckAll
|
||||||
|
// aplica una serie de funciones GOptionErrFnc a un objeto y retorna el objeto modificado,
|
||||||
|
// junto con una lista de errores que se han producido durante la configuración.
|
||||||
|
func GApplyAndCheckAll[T any](target T, options ...GOptionErrFnc[T]) (T, []error) {
|
||||||
|
var lst []error
|
||||||
|
for _, fn := range options {
|
||||||
|
if err := fn(&target); err != nil {
|
||||||
|
lst = append(lst, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return target, lst
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,4 @@
|
|||||||
|
module opts
|
||||||
|
|
||||||
|
|
||||||
|
go 1.20
|
||||||
@ -0,0 +1,93 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name bytes.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 07/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package results
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
Bytes interface {
|
||||||
|
Result
|
||||||
|
Value() []byte // GResult implementation
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BytesSuccess []byte
|
||||||
|
|
||||||
|
|
||||||
|
BytesError struct{
|
||||||
|
error
|
||||||
|
}
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
func TupleBytesSuccess(bytes []byte) ([]byte, error) {
|
||||||
|
return bytes, nil }
|
||||||
|
|
||||||
|
func TupleBytesError(err error) ([]byte, error) {
|
||||||
|
return nil, err }
|
||||||
|
|
||||||
|
|
||||||
|
func MakeBytes (bytes []byte, err error) Bytes {
|
||||||
|
if err != nil {
|
||||||
|
return BytesError{ err }
|
||||||
|
}
|
||||||
|
return BytesSuccess(bytes)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// BytesSuccess -> Bytes Implementation
|
||||||
|
|
||||||
|
func MakeBytesSuccess(success []byte) BytesSuccess {
|
||||||
|
return success }
|
||||||
|
|
||||||
|
func (_ BytesSuccess) Ok() bool {
|
||||||
|
return true }
|
||||||
|
|
||||||
|
func (_ BytesSuccess) Fail() error {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
func (s BytesSuccess) Value() []byte {
|
||||||
|
return s }
|
||||||
|
|
||||||
|
func (s BytesSuccess) Success() any {
|
||||||
|
return s }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// BytesError -> Bytes Implementation
|
||||||
|
|
||||||
|
func MakeBytesError(cause error) BytesError {
|
||||||
|
return BytesError{cause} }
|
||||||
|
|
||||||
|
func (e BytesError) Ok() bool {
|
||||||
|
return false }
|
||||||
|
|
||||||
|
func (e BytesError) Fail() error {
|
||||||
|
return e.error }
|
||||||
|
|
||||||
|
func (_ BytesError) Value() []byte {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
func (_ BytesError) Success() any {
|
||||||
|
return nil }
|
||||||
@ -0,0 +1,86 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name result.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 07/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package results
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
GResult [T any] interface {
|
||||||
|
Result
|
||||||
|
Value() T
|
||||||
|
}
|
||||||
|
|
||||||
|
ResultGSuccess [T any] struct {
|
||||||
|
Result T
|
||||||
|
}
|
||||||
|
|
||||||
|
ResultGError [T any] struct {
|
||||||
|
error
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func TupleGSuccess[T any](res T) (T, error) {
|
||||||
|
return res, nil }
|
||||||
|
|
||||||
|
func TupleGError[T any](err error) (T, error) {
|
||||||
|
var r T
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeGSuccess[T any](res T) ResultGSuccess[T] {
|
||||||
|
return ResultGSuccess[T]{res} }
|
||||||
|
|
||||||
|
func (r ResultGSuccess[T]) Value() T {
|
||||||
|
return r.Result }
|
||||||
|
|
||||||
|
func (r ResultGSuccess[T]) Success() any {
|
||||||
|
return r.Result }
|
||||||
|
|
||||||
|
func (_ ResultGSuccess[T]) Ok() bool {
|
||||||
|
return true }
|
||||||
|
|
||||||
|
func (_ ResultGSuccess[T]) Fail() error {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func MakeGError[T any](err error) ResultGError[T] {
|
||||||
|
return ResultGError[T]{error: err} }
|
||||||
|
|
||||||
|
func (r ResultGError[T]) Value() T {
|
||||||
|
var zero T
|
||||||
|
return zero
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_ ResultGError[T]) Ok() bool {
|
||||||
|
return false }
|
||||||
|
|
||||||
|
func (r ResultGError[T]) Success() any {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
|
||||||
|
func (r ResultGError[T]) Fail() error {
|
||||||
|
return r.error }
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
module rsls
|
||||||
|
|
||||||
|
go 1.22
|
||||||
@ -0,0 +1,80 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name int.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 07/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package results
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
Int interface {
|
||||||
|
Result
|
||||||
|
Value() int // GResult implementation
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
IntSuccess int
|
||||||
|
|
||||||
|
IntError struct{ error }
|
||||||
|
)
|
||||||
|
|
||||||
|
func TupleIntSuccess(result int) (int, error) {
|
||||||
|
return result, nil }
|
||||||
|
|
||||||
|
func TupleIntError(err error) ([]byte, error) {
|
||||||
|
return nil, err }
|
||||||
|
|
||||||
|
|
||||||
|
// IntSuccess -> Result, G.Result Implementation
|
||||||
|
|
||||||
|
func MakeIntSuccess(success int) IntSuccess {
|
||||||
|
return IntSuccess(success) }
|
||||||
|
|
||||||
|
func (_ IntSuccess) Ok() bool {
|
||||||
|
return true }
|
||||||
|
|
||||||
|
func (_ IntSuccess) Fail() error {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
func (s IntSuccess) Success() any {
|
||||||
|
return s }
|
||||||
|
|
||||||
|
func (s IntSuccess) Value() int {
|
||||||
|
return int(s) }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// IntError -> Result, G.Result Implementation
|
||||||
|
|
||||||
|
func MakeIntError(cause error) IntError {
|
||||||
|
return IntError{cause} }
|
||||||
|
|
||||||
|
func (e IntError) Ok() bool {
|
||||||
|
return false }
|
||||||
|
|
||||||
|
func (e IntError) Fail() error {
|
||||||
|
return e.error }
|
||||||
|
|
||||||
|
func (_ IntError) Success() any {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
func (_ IntError) Value() int {
|
||||||
|
return 0 }
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name result.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 08/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package results
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
Result interface {
|
||||||
|
// Ok ; con un valor de true indica que el resultado
|
||||||
|
// se ha producido sin errores
|
||||||
|
Ok () bool
|
||||||
|
|
||||||
|
// Success Value; contiene el valor del resultado en caso
|
||||||
|
// de que no se haya producido un error, en ese caso
|
||||||
|
// devolvera nil.
|
||||||
|
Success() any
|
||||||
|
|
||||||
|
// Fail Error; contiene el error del resultado
|
||||||
|
Fail() error
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
)
|
||||||
@ -0,0 +1,80 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name string.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 07/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package results
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
String interface {
|
||||||
|
Result
|
||||||
|
Value() string // GResult implementation
|
||||||
|
}
|
||||||
|
|
||||||
|
StringSuccess string
|
||||||
|
|
||||||
|
StringError struct{ error }
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func TupleStringSuccess(result string) (string, error) {
|
||||||
|
return result, nil }
|
||||||
|
|
||||||
|
func TupleStringError(err error) (string, error) {
|
||||||
|
return "", err }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// StringSuccess -> Result, G.Result Implementation
|
||||||
|
|
||||||
|
func (_ StringSuccess) Ok() bool {
|
||||||
|
return true }
|
||||||
|
|
||||||
|
func (s StringSuccess) Success() any {
|
||||||
|
return s }
|
||||||
|
|
||||||
|
func (_ StringSuccess) Fail() error {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
func (s StringSuccess) Value() string {
|
||||||
|
return string(s) }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// StringError -> Result, G.Result Implementation
|
||||||
|
|
||||||
|
func MakeStringError(cause error) IntError {
|
||||||
|
return IntError{cause} }
|
||||||
|
|
||||||
|
func (e StringError) Ok() bool {
|
||||||
|
return false }
|
||||||
|
|
||||||
|
func (_ StringError) Success() any {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
func (e StringError) Fail() error {
|
||||||
|
return e.error }
|
||||||
|
|
||||||
|
func (_ StringError) Value() string {
|
||||||
|
return "" }
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,109 @@
|
|||||||
|
//
|
||||||
|
// Feb21
|
||||||
|
//
|
||||||
|
// GO Active Thing
|
||||||
|
// Framework
|
||||||
|
//
|
||||||
|
// http://activething.com/dev/goat
|
||||||
|
//
|
||||||
|
// Dev : Juan V.Navarro
|
||||||
|
// Email: juanvnl@activething.com
|
||||||
|
// Date : 16/02/2021
|
||||||
|
//
|
||||||
|
// Copyright 2021 the GOAT Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
package syns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync/atomic"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
// ABool
|
||||||
|
// Type: Struct
|
||||||
|
// Desc: Atomic Bool, estructura para realizar operaciones atomicas
|
||||||
|
// sobre un valor de tipo Bool
|
||||||
|
//
|
||||||
|
ABool struct {
|
||||||
|
|
||||||
|
// value: valor sobre el que se realizaran las operaciones
|
||||||
|
// atomicas.
|
||||||
|
//
|
||||||
|
value uint32
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewABool
|
||||||
|
// Desc: Función constructor para ABool
|
||||||
|
//
|
||||||
|
// Prms: val, valor inicial
|
||||||
|
// Rets: Puntero al nuevo objeto creado.
|
||||||
|
//
|
||||||
|
func NewABool(val bool) *ABool { return &ABool{value: boolAsUint32(val)} }
|
||||||
|
|
||||||
|
// ABool.Get
|
||||||
|
// Desc:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (b *ABool) Get() bool { return atomic.LoadUint32(&b.value) == 1 }
|
||||||
|
|
||||||
|
// ABool.Set
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
//
|
||||||
|
func (b *ABool) Set(val bool) { atomic.StoreUint32(&b.value, boolAsUint32(val)) }
|
||||||
|
|
||||||
|
// ABool.Swap
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
//
|
||||||
|
func (b *ABool) Swap(new bool) bool { return atomic.SwapUint32(&b.value, boolAsUint32(new)) == 1 }
|
||||||
|
|
||||||
|
// ABool.CAS
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (b *ABool) CAS(old, new bool) bool {
|
||||||
|
return atomic.CompareAndSwapUint32(&b.value, boolAsUint32(old), boolAsUint32(new))
|
||||||
|
}
|
||||||
|
|
||||||
|
// boolAsUint32
|
||||||
|
// Desc: Convierte un valor de tipo bool a uint32
|
||||||
|
// Prms: val, valor a convertir
|
||||||
|
// Rets: uint32, El valor segun sea true = 1 o
|
||||||
|
// false = *
|
||||||
|
//
|
||||||
|
func boolAsUint32(val bool) uint32 {
|
||||||
|
if val {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,117 @@
|
|||||||
|
//
|
||||||
|
// Feb21
|
||||||
|
//
|
||||||
|
// GO Active Thing
|
||||||
|
// Framework
|
||||||
|
//
|
||||||
|
// http://activething.com/dev/goat
|
||||||
|
//
|
||||||
|
// Dev : Juan V.Navarro
|
||||||
|
// Email: juanvnl@activething.com
|
||||||
|
// Date : 16/02/2021
|
||||||
|
//
|
||||||
|
// Copyright 2021 the GOAT Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
package syns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
// ADuration
|
||||||
|
// Type: Struct
|
||||||
|
//
|
||||||
|
// Desc:
|
||||||
|
//
|
||||||
|
//
|
||||||
|
ADuration struct {
|
||||||
|
value int64
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewADuration
|
||||||
|
// Desc: Función constructor para ADuration
|
||||||
|
//
|
||||||
|
// Prms: val, valor inicial
|
||||||
|
// Rets: Puntero al nuevo objeto creado.
|
||||||
|
//
|
||||||
|
func NewADuration(val time.Duration) *ADuration { return &ADuration{value: int64(val)} }
|
||||||
|
|
||||||
|
// ADuration.Get
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *ADuration) Get() time.Duration { return time.Duration(atomic.LoadInt64(&i.value)) }
|
||||||
|
|
||||||
|
// ADuration.Set
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *ADuration) Set(val time.Duration) { atomic.StoreInt64(&i.value, int64(val)) }
|
||||||
|
|
||||||
|
// ADuration.Swap
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *ADuration) Swap(new time.Duration) time.Duration {
|
||||||
|
return time.Duration(atomic.SwapInt64(&i.value, int64(new)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ADuration.Add
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *ADuration) Add(dlt time.Duration) time.Duration {
|
||||||
|
return time.Duration(atomic.AddInt64(&i.value, int64(dlt)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ADuration.Sub
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *ADuration) Sub(dlt time.Duration) time.Duration {
|
||||||
|
return time.Duration(atomic.AddInt64(&i.value, int64(-dlt)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ADuration.CAS
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *ADuration) CAS(old, new time.Duration) bool {
|
||||||
|
return atomic.CompareAndSwapInt64(&i.value, int64(old), int64(new))
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,90 @@
|
|||||||
|
//
|
||||||
|
// Feb21
|
||||||
|
//
|
||||||
|
// GO Active Thing
|
||||||
|
// Framework
|
||||||
|
//
|
||||||
|
// http://activething.com/dev/goat
|
||||||
|
//
|
||||||
|
// Dev : Juan V.Navarro
|
||||||
|
// Email: juanvnl@activething.com
|
||||||
|
// Date : 16/02/2021
|
||||||
|
//
|
||||||
|
// Copyright 2021 the GOAT Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
package syns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync/atomic"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
// AError
|
||||||
|
// Type: Struct
|
||||||
|
// Desc:
|
||||||
|
//
|
||||||
|
//
|
||||||
|
AError struct {
|
||||||
|
value atomic.Value
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewAError
|
||||||
|
// Desc: Función constructor para AError
|
||||||
|
//
|
||||||
|
// Prms: val, valor inicial
|
||||||
|
// Rets: Puntero al nuevo objeto creado.
|
||||||
|
//
|
||||||
|
func NewAError(err error) *AError {
|
||||||
|
ae := &AError{}
|
||||||
|
if err != nil {
|
||||||
|
ae.value.Store(err)
|
||||||
|
}
|
||||||
|
return ae
|
||||||
|
}
|
||||||
|
|
||||||
|
// AError.Set
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (a *AError) Set(err error) { a.value.Store(err) }
|
||||||
|
|
||||||
|
// AError.Get
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (a *AError) Get() error {
|
||||||
|
if vl := a.value.Load(); vl != nil {
|
||||||
|
return vl.(error)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,121 @@
|
|||||||
|
//
|
||||||
|
// Feb21
|
||||||
|
//
|
||||||
|
// GO Active Thing
|
||||||
|
// Framework
|
||||||
|
//
|
||||||
|
// http://activething.com/dev/goat
|
||||||
|
//
|
||||||
|
// Dev : Juan V.Navarro
|
||||||
|
// Email: juanvnl@activething.com
|
||||||
|
// Date : 16/02/2021
|
||||||
|
//
|
||||||
|
// Copyright 2021 the GOAT Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
package syns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync/atomic"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
// AInt32
|
||||||
|
// Type: Struct
|
||||||
|
// Desc:
|
||||||
|
//
|
||||||
|
//
|
||||||
|
AInt32 struct {
|
||||||
|
value int32
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewAInt32
|
||||||
|
// Desc: Función constructor para AInt32
|
||||||
|
//
|
||||||
|
// Prms: val, valor inicial
|
||||||
|
// Rets: Puntero al nuevo objeto creado.
|
||||||
|
//
|
||||||
|
func NewAInt32(val int32) *AInt32 { return &AInt32{value: val} }
|
||||||
|
|
||||||
|
// AInt32.Get
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *AInt32) Get() int32 { return atomic.LoadInt32(&i.value) }
|
||||||
|
|
||||||
|
// AInt32.Set
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *AInt32) Set(val int32) { atomic.StoreInt32(&i.value, val) }
|
||||||
|
|
||||||
|
// AInt32.Swap
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *AInt32) Swap(new int32) int32 { return atomic.SwapInt32(&i.value, new) }
|
||||||
|
|
||||||
|
// AInt32.Add
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *AInt32) Add(dlt int32) int32 { return atomic.AddInt32(&i.value, dlt) }
|
||||||
|
|
||||||
|
// AInt32.Sub
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *AInt32) Sub(dlt int32) int32 { return atomic.AddInt32(&i.value, -dlt) }
|
||||||
|
|
||||||
|
// AInt32.Inc
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *AInt32) Inc() int32 { return i.Add(1) }
|
||||||
|
|
||||||
|
// AInt32.Dec
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *AInt32) Dec() int32 { return i.Add(-1) }
|
||||||
|
|
||||||
|
// AInt32.CAS
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *AInt32) CAS(old, new int32) bool { return atomic.CompareAndSwapInt32(&i.value, old, new) }
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,121 @@
|
|||||||
|
//
|
||||||
|
// Feb21
|
||||||
|
//
|
||||||
|
// GO Active Thing
|
||||||
|
// Framework
|
||||||
|
//
|
||||||
|
// http://activething.com/dev/goat
|
||||||
|
//
|
||||||
|
// Dev : Juan V.Navarro
|
||||||
|
// Email: juanvnl@activething.com
|
||||||
|
// Date : 16/02/2021
|
||||||
|
//
|
||||||
|
// Copyright 2021 the GOAT Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
package syns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync/atomic"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
// AInt64
|
||||||
|
// Type: Struct
|
||||||
|
// Desc:
|
||||||
|
//
|
||||||
|
//
|
||||||
|
AInt64 struct {
|
||||||
|
value int64
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewAInt64
|
||||||
|
// Desc: Función constructor para AInt64
|
||||||
|
//
|
||||||
|
// Prms: val, valor inicial
|
||||||
|
// Rets: Puntero al nuevo objeto creado.
|
||||||
|
//
|
||||||
|
func NewAInt64(val int64) *AInt64 { return &AInt64{value: val} }
|
||||||
|
|
||||||
|
// AInt64.Get
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *AInt64) Get() int64 { return atomic.LoadInt64(&i.value) }
|
||||||
|
|
||||||
|
// AInt64.Set
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *AInt64) Set(val int64) { atomic.StoreInt64(&i.value, val) }
|
||||||
|
|
||||||
|
// AInt64.Swap
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *AInt64) Swap(new int64) int64 { return atomic.SwapInt64(&i.value, new) }
|
||||||
|
|
||||||
|
// AInt64.Add
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *AInt64) Add(dlt int64) int64 { return atomic.AddInt64(&i.value, dlt) }
|
||||||
|
|
||||||
|
// AInt64.Sub
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *AInt64) Sub(dlt int64) int64 { return atomic.AddInt64(&i.value, -dlt) }
|
||||||
|
|
||||||
|
// AInt64.Inc
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *AInt64) Inc() int64 { return i.Add(1) }
|
||||||
|
|
||||||
|
// AInt64.Dec
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *AInt64) Dec() int64 { return i.Add(-1) }
|
||||||
|
|
||||||
|
// AInt64.CAS
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *AInt64) CAS(old, new int64) bool { return atomic.CompareAndSwapInt64(&i.value, old, new) }
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,155 @@
|
|||||||
|
//
|
||||||
|
// Feb21
|
||||||
|
//
|
||||||
|
// GO Active Thing
|
||||||
|
// Framework
|
||||||
|
//
|
||||||
|
// http://activething.com/dev/goat
|
||||||
|
//
|
||||||
|
// Dev : Juan V.Navarro
|
||||||
|
// Email: juanvnl@activething.com
|
||||||
|
// Date : 16/02/2021
|
||||||
|
//
|
||||||
|
// Copyright 2021 the GOAT Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
package syns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
// ANanos
|
||||||
|
// Type: Struct
|
||||||
|
// Desc:
|
||||||
|
//
|
||||||
|
//
|
||||||
|
ANanos struct {
|
||||||
|
value int64
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewANanos
|
||||||
|
// Desc: Función constructor para ANanos
|
||||||
|
//
|
||||||
|
// Prms: val, valor inicial
|
||||||
|
// Rets: Puntero al nuevo objeto creado.
|
||||||
|
//
|
||||||
|
func NewANanos(val time.Duration) *ANanos { return &ANanos{value: int64(val)} }
|
||||||
|
|
||||||
|
// ANanos.Get
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *ANanos) Get() time.Duration { return time.Duration(atomic.LoadInt64(&i.value)) }
|
||||||
|
|
||||||
|
// ANanos.Set
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *ANanos) Set(val time.Duration) { atomic.StoreInt64(&i.value, int64(val)) }
|
||||||
|
|
||||||
|
// ANanos.Swap
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *ANanos) Swap(new time.Duration) time.Duration {
|
||||||
|
return time.Duration(atomic.SwapInt64(&i.value, int64(new)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ANanos.Add
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *ANanos) Add(dlt time.Duration) time.Duration {
|
||||||
|
return time.Duration(atomic.AddInt64(&i.value, int64(dlt)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ANanos.Sub
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *ANanos) Sub(dlt time.Duration) time.Duration {
|
||||||
|
return time.Duration(atomic.AddInt64(&i.value, int64(-dlt)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ANanos.CAS
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *ANanos) CAS(old, new time.Duration) bool {
|
||||||
|
return atomic.CompareAndSwapInt64(&i.value, int64(old), int64(new))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ANanos.GetTime
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *ANanos) GetTime() time.Time { return time.Unix(0, atomic.LoadInt64(&i.value)) }
|
||||||
|
|
||||||
|
// ANanos.SetTime
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *ANanos) SetTime(val time.Time) { atomic.StoreInt64(&i.value, val.UnixNano()) }
|
||||||
|
|
||||||
|
// ANanos.GetNanos
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *ANanos) GetNanos() int64 { return atomic.LoadInt64(&i.value) }
|
||||||
|
|
||||||
|
// ANanos.SetNanos
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *ANanos) SetNanos(val int64) { atomic.StoreInt64(&i.value, val) }
|
||||||
|
|
||||||
|
// ANanos.SetNow
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (i *ANanos) SetNow() time.Time {
|
||||||
|
nw := time.Now()
|
||||||
|
i.SetTime(nw)
|
||||||
|
return nw
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,121 @@
|
|||||||
|
//
|
||||||
|
// Feb21
|
||||||
|
//
|
||||||
|
// GO Active Thing
|
||||||
|
// Framework
|
||||||
|
//
|
||||||
|
// http://activething.com/dev/goat
|
||||||
|
//
|
||||||
|
// Dev : Juan V.Navarro
|
||||||
|
// Email: juanvnl@activething.com
|
||||||
|
// Date : 16/02/2021
|
||||||
|
//
|
||||||
|
// Copyright 2021 the GOAT Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
package syns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync/atomic"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
// AUInt32
|
||||||
|
// Type: Struct
|
||||||
|
// Desc:
|
||||||
|
//
|
||||||
|
//
|
||||||
|
AUInt32 struct {
|
||||||
|
value uint32
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewAUInt32
|
||||||
|
// Desc: Función constructor para AUInt32
|
||||||
|
//
|
||||||
|
// Prms: val, valor inicial
|
||||||
|
// Rets: Puntero al nuevo objeto creado.
|
||||||
|
//
|
||||||
|
func NewAUInt32(val uint32) *AUInt32 { return &AUInt32{value: val} }
|
||||||
|
|
||||||
|
// AUInt32.Get
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt32) Get() uint32 { return atomic.LoadUint32(&u.value) }
|
||||||
|
|
||||||
|
// AUInt32.Set
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt32) Set(val uint32) { atomic.StoreUint32(&u.value, val) }
|
||||||
|
|
||||||
|
// AUInt32.Swap
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt32) Swap(new uint32) uint32 { return atomic.SwapUint32(&u.value, new) }
|
||||||
|
|
||||||
|
// AUInt32.Add
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt32) Add(dlt uint32) uint32 { return atomic.AddUint32(&u.value, dlt) }
|
||||||
|
|
||||||
|
// AUInt32.Sub
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt32) Sub(dlt uint32) uint32 { return atomic.AddUint32(&u.value, ^uint32(dlt-1)) }
|
||||||
|
|
||||||
|
// AUInt32.Inc
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt32) Inc() uint32 { return u.Add(1) }
|
||||||
|
|
||||||
|
// AUInt32.Dec
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt32) Dec() uint32 { return u.Add(^uint32(0)) }
|
||||||
|
|
||||||
|
// AUInt32.CAS
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt32) CAS(old, new uint32) bool { return atomic.CompareAndSwapUint32(&u.value, old, new) }
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,121 @@
|
|||||||
|
//
|
||||||
|
// Feb21
|
||||||
|
//
|
||||||
|
// GO Active Thing
|
||||||
|
// Framework
|
||||||
|
//
|
||||||
|
// http://activething.com/dev/goat
|
||||||
|
//
|
||||||
|
// Dev : Juan V.Navarro
|
||||||
|
// Email: juanvnl@activething.com
|
||||||
|
// Date : 16/02/2021
|
||||||
|
//
|
||||||
|
// Copyright 2021 the GOAT Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
package syns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync/atomic"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
// AUInt64
|
||||||
|
// Type: Struct
|
||||||
|
// Desc:
|
||||||
|
//
|
||||||
|
//
|
||||||
|
AUInt64 struct {
|
||||||
|
value uint64
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewAUInt64
|
||||||
|
// Desc: Función constructor para AUInt64
|
||||||
|
//
|
||||||
|
// Prms: val, valor inicial
|
||||||
|
// Rets: Puntero al nuevo objeto creado.
|
||||||
|
//
|
||||||
|
func NewAUInt64(val uint64) *AUInt64 { return &AUInt64{value: val} }
|
||||||
|
|
||||||
|
// AUInt64.Get
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt64) Get() uint64 { return atomic.LoadUint64(&u.value) }
|
||||||
|
|
||||||
|
// AUInt64.Set
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt64) Set(val uint64) { atomic.StoreUint64(&u.value, val) }
|
||||||
|
|
||||||
|
// AUInt64.Swap
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt64) Swap(new uint64) uint64 { return atomic.SwapUint64(&u.value, new) }
|
||||||
|
|
||||||
|
// AUInt64.Add
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt64) Add(dlt uint64) uint64 { return atomic.AddUint64(&u.value, dlt) }
|
||||||
|
|
||||||
|
// AUInt64.Sub
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt64) Sub(dlt uint64) uint64 { return atomic.AddUint64(&u.value, ^uint64(dlt-1)) }
|
||||||
|
|
||||||
|
// AUInt64.Inc
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt64) Inc() uint64 { return u.Add(1) }
|
||||||
|
|
||||||
|
// AUInt64.Dec
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt64) Dec() uint64 { return u.Add(^uint64(0)) }
|
||||||
|
|
||||||
|
// AUInt64.CAS
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt64) CAS(old, new uint64) bool { return atomic.CompareAndSwapUint64(&u.value, old, new) }
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
//
|
||||||
|
// Feb21
|
||||||
|
//
|
||||||
|
// GO Active Thing
|
||||||
|
// Framework
|
||||||
|
//
|
||||||
|
// http://activething.com/dev/goat
|
||||||
|
//
|
||||||
|
// Dev : Juan V.Navarro
|
||||||
|
// Email: juanvnl@activething.com
|
||||||
|
// Date : 16/02/2021
|
||||||
|
//
|
||||||
|
// Copyright 2021 the GOAT Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
// +build 386 arm mips mipsle
|
||||||
|
|
||||||
|
package syns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync/atomic"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AInt struct{ value int32 }
|
||||||
|
|
||||||
|
func NewAInt(v int) *AInt { return &AInt{value: int32(v)} }
|
||||||
|
|
||||||
|
func (u *AInt) Get() int { return int(atomic.LoadInt32(&u.value)) }
|
||||||
|
func (u *AInt) Set(v int) { atomic.StoreInt32(&u.value, int32(v)) }
|
||||||
|
func (u *AInt) Swap(new int) int { return int(atomic.SwapInt32(&u.value, int32(new))) }
|
||||||
|
|
||||||
|
func (u *AInt) Add(dlt int) int { return int(atomic.AddInt32(&u.value, int32(dlt))) }
|
||||||
|
func (u *AInt) Sub(dlt int) int { return int(atomic.AddInt32(&u.value, -dlt)) }
|
||||||
|
func (u *AInt) Inc() int { return u.Add(1) }
|
||||||
|
func (u *AInt) Dec() int { return u.Add(-1) }
|
||||||
|
|
||||||
|
func (u *AInt) CAS(old, new int) bool {
|
||||||
|
return atomic.CompareAndSwapInt32(&u.value, int32(old), int32(new))
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
//
|
||||||
|
// Feb21
|
||||||
|
//
|
||||||
|
// GO Active Thing
|
||||||
|
// Framework
|
||||||
|
//
|
||||||
|
// http://activething.com/dev/goat
|
||||||
|
//
|
||||||
|
// Dev : Juan V.Navarro
|
||||||
|
// Email: juanvnl@activething.com
|
||||||
|
// Date : 16/02/2021
|
||||||
|
//
|
||||||
|
// Copyright 2021 the GOAT Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
// +build 386 arm mips mipsle
|
||||||
|
|
||||||
|
package syns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync/atomic"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AUInt struct{ value uint32 }
|
||||||
|
|
||||||
|
func NewAUint(v uint) *AUInt { return &AUInt{value: uint32(v)} }
|
||||||
|
|
||||||
|
func (u *AUInt) Get() uint { return uint(atomic.LoadUint32(&u.value)) }
|
||||||
|
func (u *AUInt) Set(v uint) { atomic.StoreUint32(&u.value, uint32(v)) }
|
||||||
|
func (u *AUInt) Swap(new uint) uint { return uint(atomic.SwapUint32(&u.value, uint32(new))) }
|
||||||
|
|
||||||
|
func (u *AUInt) Add(dlt uint) uint { return uint(atomic.AddUint32(&u.value, uint32(dlt))) }
|
||||||
|
func (u *AUInt) Sub(dlt uint) uint { return uint(atomic.AddUint32(&u.value, ^uint32(uint32(dlt)-1))) }
|
||||||
|
func (u *AUInt) Inc() uint { return u.Add(1) }
|
||||||
|
func (u *AUInt) Dec() uint { return u.Add(uint(^uint32(0))) }
|
||||||
|
|
||||||
|
func (u *AUInt) CAS(old, new uint) bool {
|
||||||
|
return atomic.CompareAndSwapUint32(&u.value, uint32(old), uint32(new))
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,124 @@
|
|||||||
|
//
|
||||||
|
// Feb21
|
||||||
|
//
|
||||||
|
// GO Active Thing
|
||||||
|
// Framework
|
||||||
|
//
|
||||||
|
// http://activething.com/dev/goat
|
||||||
|
//
|
||||||
|
// Dev : Juan V.Navarro
|
||||||
|
// Email: juanvnl@activething.com
|
||||||
|
// Date : 16/02/2021
|
||||||
|
//
|
||||||
|
// Copyright 2021 the GOAT Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
// +build amd64 arm64 ppc64 ppc64le mips64 mips64le s390x
|
||||||
|
|
||||||
|
package syns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync/atomic"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
// AInt
|
||||||
|
// Type: Struct
|
||||||
|
// Desc:
|
||||||
|
//
|
||||||
|
AInt struct {
|
||||||
|
value int64
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewAInt
|
||||||
|
// Desc: Función constructor para AInt
|
||||||
|
//
|
||||||
|
// Prms: val, valor inicial
|
||||||
|
// Rets: Puntero al nuevo objeto creado.
|
||||||
|
//
|
||||||
|
func NewAInt(val int) *AInt { return &AInt{value: int64(val)} }
|
||||||
|
|
||||||
|
// AInt.Get
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AInt) Get() int { return int(atomic.LoadInt64(&u.value)) }
|
||||||
|
|
||||||
|
// AInt.Set
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AInt) Set(v int) { atomic.StoreInt64(&u.value, int64(v)) }
|
||||||
|
|
||||||
|
// AInt.Swap
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AInt) Swap(new int) int { return int(atomic.SwapInt64(&u.value, int64(new))) }
|
||||||
|
|
||||||
|
// AInt.Add
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AInt) Add(dlt int) int { return int(atomic.AddInt64(&u.value, int64(dlt))) }
|
||||||
|
|
||||||
|
// AInt.Sub
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AInt) Sub(dlt int) int { return int(atomic.AddInt64(&u.value, int64(-dlt))) }
|
||||||
|
|
||||||
|
// AInt.Inc
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AInt) Inc() int { return u.Add(1) }
|
||||||
|
|
||||||
|
// AInt.Dec
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AInt) Dec() int { return u.Add(-1) }
|
||||||
|
|
||||||
|
// AInt.CAS
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AInt) CAS(old, new int) bool {
|
||||||
|
return atomic.CompareAndSwapInt64(&u.value, int64(old), int64(new))
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,124 @@
|
|||||||
|
//
|
||||||
|
// Feb21
|
||||||
|
//
|
||||||
|
// GO Active Thing
|
||||||
|
// Framework
|
||||||
|
//
|
||||||
|
// http://activething.com/dev/goat
|
||||||
|
//
|
||||||
|
// Dev : Juan V.Navarro
|
||||||
|
// Email: juanvnl@activething.com
|
||||||
|
// Date : 16/02/2021
|
||||||
|
//
|
||||||
|
// Copyright 2021 the GOAT Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
// +build amd64 arm64 ppc64 ppc64le mips64 mips64le s390x
|
||||||
|
|
||||||
|
package syns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync/atomic"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
// AUInt
|
||||||
|
// Type: Struct
|
||||||
|
// Desc:
|
||||||
|
//
|
||||||
|
AUInt struct {
|
||||||
|
value uint64
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewAInt
|
||||||
|
// Desc: Función constructor para AUInt
|
||||||
|
//
|
||||||
|
// Prms: val, valor inicial
|
||||||
|
// Rets: Puntero al nuevo objeto creado.
|
||||||
|
//
|
||||||
|
func NewAUint(val int64) *AUInt { return &AUInt{value: uint64(val)} }
|
||||||
|
|
||||||
|
// AUInt.Get
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt) Get() uint { return uint(atomic.LoadUint64(&u.value)) }
|
||||||
|
|
||||||
|
// AUInt.Set
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt) Set(val uint) { atomic.StoreUint64(&u.value, uint64(val)) }
|
||||||
|
|
||||||
|
// AUInt.Swap
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt) Swap(new uint) uint { return uint(atomic.SwapUint64(&u.value, uint64(new))) }
|
||||||
|
|
||||||
|
// AUInt.Add
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt) Add(dlt uint) uint { return uint(atomic.AddUint64(&u.value, uint64(dlt))) }
|
||||||
|
|
||||||
|
// AUInt.Sub
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt) Sub(dlt uint) uint { return uint(atomic.AddUint64(&u.value, ^uint64(dlt-1))) }
|
||||||
|
|
||||||
|
// AUInt.Inc
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt) Inc() uint { return u.Add(1) }
|
||||||
|
|
||||||
|
// AUInt.Dec
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt) Dec() uint { return uint(^uint64(0)) }
|
||||||
|
|
||||||
|
// AUInt.CAS
|
||||||
|
// Desc:
|
||||||
|
// Prms:
|
||||||
|
// Rets:
|
||||||
|
//
|
||||||
|
func (u *AUInt) CAS(old, new uint) bool {
|
||||||
|
return atomic.CompareAndSwapUint64(&u.value, uint64(old), uint64(new))
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,63 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name gogo.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package ctasks
|
||||||
|
|
||||||
|
import "errs"
|
||||||
|
|
||||||
|
const (
|
||||||
|
|
||||||
|
CompletionFromChild int = iota * -1
|
||||||
|
CompletionFromSelf
|
||||||
|
CompletionFromParent
|
||||||
|
CompletionFromContext
|
||||||
|
CompletionFromTimer
|
||||||
|
CompletionFromRequest
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
var (
|
||||||
|
|
||||||
|
G = struct {
|
||||||
|
|
||||||
|
ErrInvalidCompletion errs.ErrCode
|
||||||
|
ErrInvalidState errs.ErrCode
|
||||||
|
ErrCancelByParent errs.ErrCode
|
||||||
|
ErrCancelByRequest errs.ErrCode
|
||||||
|
ErrCancelByContext errs.ErrCode
|
||||||
|
ErrCancelByTimer errs.ErrCode
|
||||||
|
|
||||||
|
}{
|
||||||
|
ErrInvalidCompletion: errs.ErrCode("invalid-completion"),
|
||||||
|
ErrInvalidState : errs.ErrCode("invalid-state"),
|
||||||
|
ErrCancelByParent : errs.ErrCode("cancel-by-parent"),
|
||||||
|
ErrCancelByRequest : errs.ErrCode("cancel-by-request"),
|
||||||
|
ErrCancelByContext : errs.ErrCode("cancel-by-context"),
|
||||||
|
ErrCancelByTimer : errs.ErrCode("cancel-by-timer"),
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,42 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name completer.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package ctasks
|
||||||
|
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
Completer interface {
|
||||||
|
|
||||||
|
Complete (context Context, cid int)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CompleteFnc func (context Context, cid int)
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (f CompleteFnc) Complete (context Context, cid int) {
|
||||||
|
f(context,cid) }
|
||||||
@ -0,0 +1,373 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name completion.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package ctasks
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"opts"
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
|
"syncs/works"
|
||||||
|
"time"
|
||||||
|
cronus "timers"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
Completion struct {
|
||||||
|
/*embedded*/context.Context
|
||||||
|
mux sync.RWMutex
|
||||||
|
wgr sync.WaitGroup
|
||||||
|
|
||||||
|
parent Context
|
||||||
|
expiration *cronus.Expiration
|
||||||
|
|
||||||
|
mode Mode
|
||||||
|
state uint32
|
||||||
|
pending uint32
|
||||||
|
|
||||||
|
cid int
|
||||||
|
result Result
|
||||||
|
|
||||||
|
dispatchFn dispatchFnc
|
||||||
|
cancelFn func()
|
||||||
|
|
||||||
|
completers []Completer
|
||||||
|
}
|
||||||
|
|
||||||
|
CompletionFnc func (c *Completion) error
|
||||||
|
|
||||||
|
dispatchFnc func (*Completion, Completer, int) error
|
||||||
|
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func NewCompletion (options ...CompletionFnc) (*Completion,error) {
|
||||||
|
|
||||||
|
c := &Completion {
|
||||||
|
mode : ModeAll,
|
||||||
|
cid : CompletionFromSelf,
|
||||||
|
dispatchFn: dispatcher,
|
||||||
|
}
|
||||||
|
for _,o := range options {
|
||||||
|
if er := o(c); er != nil {
|
||||||
|
return nil,er
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if c.expiration == nil {
|
||||||
|
c.expiration = cronus.NewExpiration(0,nil)
|
||||||
|
}
|
||||||
|
return c,nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Completion) Mode () Mode {
|
||||||
|
return c.mode }
|
||||||
|
|
||||||
|
func (c *Completion) State () State {
|
||||||
|
return State(atomic.LoadUint32(&c.state)) }
|
||||||
|
|
||||||
|
func (c *Completion) Pending() int {
|
||||||
|
return int(atomic.LoadUint32(&c.pending)) }
|
||||||
|
|
||||||
|
func (c *Completion) IsCompleted () bool {
|
||||||
|
return c.State() > StateStarted
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Completion) Chrono () cronus.Chronometer {
|
||||||
|
return c.expiration.Chono() }
|
||||||
|
|
||||||
|
func (c *Completion) Result () Result {
|
||||||
|
c.wgr.Wait()
|
||||||
|
return c.result
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Completion) Wait () {
|
||||||
|
c.wgr.Wait() }
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Completion) AddCompleter (cms ... Completer) error {
|
||||||
|
c.mux.Lock()
|
||||||
|
if c.State() != StateCreated {
|
||||||
|
c.mux.Unlock()
|
||||||
|
return G.ErrInvalidState
|
||||||
|
}
|
||||||
|
for _,cm := range cms {
|
||||||
|
c.completers = append(c.completers, cm)
|
||||||
|
}
|
||||||
|
c.mux.Unlock()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Completion) Cancel () {
|
||||||
|
c.notify(CompletionFromRequest, StateCanceled,nil,G.ErrCancelByRequest) }
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Completion) Start (ctx context.Context) error {
|
||||||
|
return c.complete(ctx,nil,CompletionFromSelf) }
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Completion) Complete (cmp Context, cid int) {
|
||||||
|
_ = c.complete(nil,cmp,cid) }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Completion) complete (ctx context.Context, cctx Context, cid int) error {
|
||||||
|
c.mux.Lock()
|
||||||
|
|
||||||
|
if c.State() != StateCreated {
|
||||||
|
c.mux.Unlock()
|
||||||
|
return G.ErrInvalidState
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nos sirve para determinar de donde va a depender la expiracion
|
||||||
|
// en tiempo de la completion en caso de que exista, o bien de la
|
||||||
|
// completion padre o bien del contexto.
|
||||||
|
//
|
||||||
|
var ex cronus.Expirer
|
||||||
|
|
||||||
|
if cctx != nil {
|
||||||
|
c.parent = cctx
|
||||||
|
c.Context= cctx
|
||||||
|
c.cid = cid
|
||||||
|
if c.parent.IsCompleted() {
|
||||||
|
c.mux.Unlock()
|
||||||
|
c.notify(CompletionFromParent, StateCanceled,nil,G.ErrCancelByParent)
|
||||||
|
return G.ErrCancelByParent
|
||||||
|
}
|
||||||
|
ex = c.parent
|
||||||
|
} else {
|
||||||
|
if ctx == nil {
|
||||||
|
c.Context = context.Background()
|
||||||
|
} else {
|
||||||
|
c.Context = ctx
|
||||||
|
if ctx.Err() != nil {
|
||||||
|
c.mux.Unlock()
|
||||||
|
c.notify(CompletionFromContext, StateCanceled,nil,G.ErrCancelByContext)
|
||||||
|
return G.ErrCancelByContext.WrapWithCause(ctx.Err())
|
||||||
|
}
|
||||||
|
|
||||||
|
ch := make(chan struct{})
|
||||||
|
c.cancelFn = func(){ close(ch)}
|
||||||
|
go func(cc *Completion, ch chan struct{}){
|
||||||
|
select {
|
||||||
|
case <- ch:
|
||||||
|
case <- cc.Context.Done() :
|
||||||
|
er := G.ErrCancelByContext.WrapWithCause(cc.Context.Err())
|
||||||
|
cc.notify(CompletionFromContext, StateCanceled,nil,er)
|
||||||
|
}
|
||||||
|
}(c,ch)
|
||||||
|
}
|
||||||
|
ex = ctx
|
||||||
|
}
|
||||||
|
|
||||||
|
if er := c.expiration.Start(ex); er != nil {
|
||||||
|
c.mux.Unlock()
|
||||||
|
c.notify(CompletionFromSelf, StateFaulted,nil,er)
|
||||||
|
return er
|
||||||
|
}
|
||||||
|
|
||||||
|
atomic.StoreUint32(&c.state,uint32(StateStarted))
|
||||||
|
c.wgr.Add(1)
|
||||||
|
|
||||||
|
go func (c *Completion) {
|
||||||
|
ln := len(c.completers)
|
||||||
|
if ln == 0 {
|
||||||
|
c.mux.Unlock()
|
||||||
|
c.notify(CompletionFromSelf, StateCompleted, nil, nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
atomic.StoreUint32(&c.pending,uint32(ln))
|
||||||
|
cs := c.completers
|
||||||
|
c.mux.Unlock()
|
||||||
|
|
||||||
|
for ix, cm := range cs {
|
||||||
|
if c.IsCompleted() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if er := c.dispatchFn(c,cm,ix); er != nil {
|
||||||
|
c.notify(CompletionFromSelf, StateFaulted,nil,er)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}(c)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Completion) Notify (frm int, val interface{}, err error) {
|
||||||
|
c.notify(frm, StateCompleted,val,err) }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (c *Completion) notify (frm int, ste State, val interface{}, err error) {
|
||||||
|
c.mux.Lock()
|
||||||
|
os := c.State()
|
||||||
|
if os > StateStarted {
|
||||||
|
c.mux.Unlock()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if frm >= CompletionFromChild {
|
||||||
|
cn := atomic.AddUint32(&c.pending,-1)
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case c.mode.IsAnyOrResult() && val != nil:
|
||||||
|
atomic.StoreUint32(&c.state,uint32(StateCompleted))
|
||||||
|
c.result = NewResultValue(frm, val)
|
||||||
|
|
||||||
|
case c.mode.IsAnyOrError() && err != nil:
|
||||||
|
atomic.StoreUint32(&c.state,uint32(StateFaulted))
|
||||||
|
c.result = NewResultError(frm, err)
|
||||||
|
|
||||||
|
case c.mode == ModeTask:
|
||||||
|
c.result = NewResult(frm, val, err)
|
||||||
|
|
||||||
|
default:
|
||||||
|
if c.mode == ModeAll {
|
||||||
|
if c.result == nil {
|
||||||
|
c.result = NewResultList(c.cid, NewResult(frm, val, err))
|
||||||
|
} else {
|
||||||
|
c.result.(*ResultList).Add(NewResult(frm, val, err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if cn == 0 {
|
||||||
|
atomic.StoreUint32(&c.state,uint32(StateCompleted))
|
||||||
|
} else {
|
||||||
|
c.mux.Unlock()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
atomic.StoreUint32(&c.state,uint32(ste))
|
||||||
|
c.result = NewResult(frm,val,err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_ = c.expiration.Stop()
|
||||||
|
if c.cancelFn != nil {
|
||||||
|
c.cancelFn()
|
||||||
|
}
|
||||||
|
c.wgr.Done()
|
||||||
|
c.mux.Unlock()
|
||||||
|
|
||||||
|
|
||||||
|
// Solo notificamos a las completions hijas y al padre en caso de que se haya iniciado
|
||||||
|
if os == StateStarted {
|
||||||
|
for _, ch := range c.completers {
|
||||||
|
// Notificamos solo a los completer que a su vez implementan
|
||||||
|
// Context
|
||||||
|
if cm, is := ch.(Context); is {
|
||||||
|
if !cm.IsCompleted() {
|
||||||
|
cm.Notify(CompletionFromParent, nil, G.ErrCancelByParent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Notificamos al padre en caso de que tenga y la completion no venga de el
|
||||||
|
if frm != CompletionFromParent && c.parent != nil {
|
||||||
|
c.parent.Notify(c.cid,c.result.Value(),c.result.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func dispatcher (completion *Completion, completer Completer, cid int) error {
|
||||||
|
go completer.Complete(completion,cid)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// WithMode
|
||||||
|
// Desc: Función para el constructor de Completion,
|
||||||
|
// establece el mode de como se llegara a la completion
|
||||||
|
//
|
||||||
|
func WithMode (mode Mode) opts.GOptionErrFnc[Completion] {
|
||||||
|
return func(c *Completion) error {
|
||||||
|
c.mode = mode
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// WithTimeout
|
||||||
|
// Desc: Función para el constructor de Completion
|
||||||
|
// Establece el tiempo máximo de la completion
|
||||||
|
//
|
||||||
|
func WithTimeout (tmo time.Duration) opts.GOptionErrFnc[Completion] {
|
||||||
|
return func(c *Completion) error {
|
||||||
|
c.expiration = cronus.NewExpiration(tmo,func(){
|
||||||
|
c.notify(CompletionFromTimer, StateCanceled,nil,G.ErrCancelByTimer)
|
||||||
|
})
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// WithCompleters
|
||||||
|
// Desc: Función para el constructor de Completion,
|
||||||
|
// añade los objeto a completar en la completion
|
||||||
|
//
|
||||||
|
func WithCompleters (completers ... Completer) opts.GOptionErrFnc[Completion] {
|
||||||
|
return func(c *Completion) error {
|
||||||
|
if c.State() != StateCreated {
|
||||||
|
return G.ErrInvalidState
|
||||||
|
}
|
||||||
|
for _, cm := range completers {
|
||||||
|
c.completers = append(c.completers, cm)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// WithWorkPool
|
||||||
|
// Desc: Función para el constructor de Completion,
|
||||||
|
// utiliza un pool de trabajo para completar
|
||||||
|
// las tareas.
|
||||||
|
//
|
||||||
|
func WithWorkPool (pool *works.Pool) opts.GOptionErrFnc[Completion] {
|
||||||
|
return func(c *Completion) error {
|
||||||
|
c.dispatchFn = dispatchFnc(func (cm *Completion, cr Completer, ci int) error {
|
||||||
|
return pool.DoWork(c,func(){
|
||||||
|
cr.Complete(cm,ci)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -0,0 +1,39 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name completion_context.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package ctasks
|
||||||
|
|
||||||
|
import "context"
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
Context interface {
|
||||||
|
context.Context
|
||||||
|
|
||||||
|
IsCompleted () bool
|
||||||
|
|
||||||
|
Notify (cid int, val interface {}, err error)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,92 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name completion_mode.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package ctasks
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const(
|
||||||
|
|
||||||
|
ModeAll Mode = iota
|
||||||
|
|
||||||
|
// ModeAny Las tareas se ejecutaran haste que se
|
||||||
|
//produzca el primer resultado o el primer error
|
||||||
|
ModeAny
|
||||||
|
|
||||||
|
//ModeResult Las tareas se ejecutaran hasta que
|
||||||
|
//se obtenga el primer resultado.
|
||||||
|
ModeResult
|
||||||
|
|
||||||
|
//ModeError Las tareas se completaran en el momento de
|
||||||
|
//que se produzca un error.
|
||||||
|
ModeError
|
||||||
|
|
||||||
|
//CompletionModeTask Modo para las completions de una sola task
|
||||||
|
ModeTask
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
Mode uint8
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func (m Mode) IsAnyOrResult () bool {
|
||||||
|
return m == ModeResult || m == ModeAny
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (m Mode) IsAnyOrError () bool {
|
||||||
|
return m == ModeError || m == ModeAny
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (m Mode) String () string {
|
||||||
|
switch m {
|
||||||
|
case ModeAll: return "all"
|
||||||
|
case ModeAny: return "any"
|
||||||
|
case ModeResult: return "result"
|
||||||
|
case ModeError: return "error"
|
||||||
|
case ModeTask: return "task"
|
||||||
|
default:
|
||||||
|
return "??"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,51 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name completion_result.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package ctasks
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
Result interface {
|
||||||
|
|
||||||
|
CID () int
|
||||||
|
|
||||||
|
Value() any
|
||||||
|
|
||||||
|
Error() error
|
||||||
|
|
||||||
|
Kind () ResultKind
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func NewResult(cid int, val any, err error) Result {
|
||||||
|
if err != nil {
|
||||||
|
return *NewResultError(cid,err)
|
||||||
|
}
|
||||||
|
if val != nil {
|
||||||
|
return *NewResultValue(cid,val)
|
||||||
|
}
|
||||||
|
return ResultVoid(cid)
|
||||||
|
}
|
||||||
@ -0,0 +1,74 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name completion_result_error.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package ctasks
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
ResultError struct {
|
||||||
|
cid int
|
||||||
|
err error
|
||||||
|
}
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewResultError(cid int, err error) *ResultError {
|
||||||
|
return &ResultError{
|
||||||
|
cid : cid,
|
||||||
|
err : err,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r ResultError) CID () int {
|
||||||
|
return r.cid }
|
||||||
|
|
||||||
|
func (_ ResultError) Kind () ResultKind {
|
||||||
|
return ResultKindError
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_ ResultError) Value () any {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
func (r ResultError) Error () error {
|
||||||
|
return r.err }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,87 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name completion_result_kind.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package ctasks
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const(
|
||||||
|
|
||||||
|
ResultKindVoid ResultKind = iota
|
||||||
|
ResultKindError
|
||||||
|
ResultKindValue
|
||||||
|
ResultKindList
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
ResultKind uint8
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
func (k ResultKind) IsVoid () bool {
|
||||||
|
return k == ResultKindVoid
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k ResultKind) IsError() bool {
|
||||||
|
return k == ResultKindError
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (k ResultKind) IsValue() bool {
|
||||||
|
return k == ResultKindValue
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (k ResultKind) IsList () bool {
|
||||||
|
return k == ResultKindList
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (k ResultKind) String () string {
|
||||||
|
switch k {
|
||||||
|
case ResultKindVoid: return "void"
|
||||||
|
case ResultKindValue: return "value"
|
||||||
|
case ResultKindError: return "error"
|
||||||
|
case ResultKindList: return "list"
|
||||||
|
default:
|
||||||
|
return "??"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,88 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name completion_result_list.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package ctasks
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
ResultList struct {
|
||||||
|
cid int
|
||||||
|
results []Result
|
||||||
|
}
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewResultList(cid int, results ...Result) *ResultList {
|
||||||
|
ls := make([]Result,len(results))
|
||||||
|
copy(ls, results)
|
||||||
|
return &ResultList{
|
||||||
|
cid: cid,
|
||||||
|
results: ls,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (r *ResultList) Add (rsl Result) {
|
||||||
|
if rsl != nil {
|
||||||
|
r.results = append(r.results, rsl)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (r ResultList) CID () int {
|
||||||
|
return r.cid }
|
||||||
|
|
||||||
|
|
||||||
|
func (_ ResultList) Kind () ResultKind {
|
||||||
|
return ResultKindList
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (_ ResultList) Error () error {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
|
||||||
|
func (r ResultList) Value () any {
|
||||||
|
return r.results }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,74 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name completion_result_value.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package ctasks
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
ResultValue struct {
|
||||||
|
cid int
|
||||||
|
value any
|
||||||
|
}
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewResultValue(cid int, value any) *ResultValue {
|
||||||
|
return &ResultValue{
|
||||||
|
cid : cid,
|
||||||
|
value: value,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r ResultValue) CID () int {
|
||||||
|
return r.cid }
|
||||||
|
|
||||||
|
func (_ ResultValue) Kind () ResultKind {
|
||||||
|
return ResultKindValue
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_ ResultValue) Error () error {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
func (r ResultValue) Value () any {
|
||||||
|
return r.value }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,70 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name completion_result_void.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package ctasks
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
ResultVoid int
|
||||||
|
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func (r ResultVoid) CID () int {
|
||||||
|
return int(r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_ ResultVoid) Kind () ResultKind {
|
||||||
|
return ResultKindVoid
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_ ResultVoid) Value () any {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
func (_ ResultVoid) Error () error {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,58 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name completion_state.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package ctasks
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const (
|
||||||
|
|
||||||
|
StateCreated State = iota
|
||||||
|
StateStarted
|
||||||
|
StateCompleted
|
||||||
|
StateCanceled
|
||||||
|
StateFaulted
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
State uint32
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func (s State) String () string {
|
||||||
|
switch s {
|
||||||
|
case StateCreated: return "created"
|
||||||
|
case StateStarted: return "started"
|
||||||
|
case StateCompleted: return "completed"
|
||||||
|
case StateCanceled: return "canceled"
|
||||||
|
case StateFaulted: return "faulted"
|
||||||
|
default: return "??"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,4 @@
|
|||||||
|
module syns
|
||||||
|
|
||||||
|
|
||||||
|
go 1.20
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
//
|
||||||
|
// Feb21
|
||||||
|
//
|
||||||
|
// GO Active Thing
|
||||||
|
// Framework
|
||||||
|
//
|
||||||
|
// http://activething.com/dev/goat
|
||||||
|
//
|
||||||
|
// Dev : Juan V.Navarro
|
||||||
|
// Email: juanvnl@activething.com
|
||||||
|
// Date : 16/02/2021
|
||||||
|
//
|
||||||
|
// Copyright 2021 the GOAT Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
package syns
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
LockerRead interface {
|
||||||
|
RLock()
|
||||||
|
RUnlock()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
//
|
||||||
|
// Feb21
|
||||||
|
//
|
||||||
|
// GO Active Thing
|
||||||
|
// Framework
|
||||||
|
//
|
||||||
|
// http://activething.com/dev/goat
|
||||||
|
//
|
||||||
|
// Dev : Juan V.Navarro
|
||||||
|
// Email: juanvnl@activething.com
|
||||||
|
// Date : 16/02/2021
|
||||||
|
//
|
||||||
|
// Copyright 2021 the GOAT Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
package syns
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
LockerRW interface {
|
||||||
|
LockerRead
|
||||||
|
LockerWrite
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
//
|
||||||
|
// Feb21
|
||||||
|
//
|
||||||
|
// GO Active Thing
|
||||||
|
// Framework
|
||||||
|
//
|
||||||
|
// http://activething.com/dev/goat
|
||||||
|
//
|
||||||
|
// Dev : Juan V.Navarro
|
||||||
|
// Email: juanvnl@activething.com
|
||||||
|
// Date : 16/02/2021
|
||||||
|
//
|
||||||
|
// Copyright 2021 the GOAT Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
package syns
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
LockerWrite interface {
|
||||||
|
Lock()
|
||||||
|
Unlock()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,45 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name nop_locker.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package syns
|
||||||
|
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
NopLocker struct{}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func (_ NopLocker) Lock() {}
|
||||||
|
|
||||||
|
|
||||||
|
func (_ NopLocker) Unlock() {}
|
||||||
|
|
||||||
|
|
||||||
|
func (_ NopLocker) RLock() {}
|
||||||
|
|
||||||
|
|
||||||
|
func (_ NopLocker) RUnlock() {}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,134 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name pool.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 17/01/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package pools
|
||||||
|
|
||||||
|
import (
|
||||||
|
"opts"
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
GPool[T any] struct {
|
||||||
|
PoolStatsInfo
|
||||||
|
|
||||||
|
inner sync.Pool
|
||||||
|
|
||||||
|
cap int32
|
||||||
|
len int32
|
||||||
|
|
||||||
|
createFn func() *T
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewGPool[T any](ops ...opts.GOptionFnc[GPool[T]]) *GPool[T] {
|
||||||
|
return opts.GApply(&GPool[T]{}, ops...) }
|
||||||
|
|
||||||
|
|
||||||
|
func (p *GPool[T]) Len() int32 {
|
||||||
|
return atomic.LoadInt32(&p.len) }
|
||||||
|
|
||||||
|
|
||||||
|
func (p *GPool[T]) Cap() int32 {
|
||||||
|
return atomic.LoadInt32(&p.cap) }
|
||||||
|
|
||||||
|
|
||||||
|
func (p *GPool[T]) Get() *T {
|
||||||
|
o := p.inner.Get()
|
||||||
|
if o != nil {
|
||||||
|
p.AddAcquired()
|
||||||
|
if p.Len() > 0 {
|
||||||
|
atomic.AddInt32(&p.len, -1)
|
||||||
|
}
|
||||||
|
return o.(*T)
|
||||||
|
}
|
||||||
|
if o = p.createFn(); o != nil {
|
||||||
|
p.AddCreated()
|
||||||
|
}
|
||||||
|
return o.(*T)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (p *GPool[T]) Put(obj *T) {
|
||||||
|
if obj == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c := p.Cap()
|
||||||
|
p.AddReleased()
|
||||||
|
if c == -1 || c >= p.Len() {
|
||||||
|
atomic.AddInt32(&p.len, 1)
|
||||||
|
p.inner.Put(obj)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (p *GPool[T]) Empty() {
|
||||||
|
for p.Len() > 0 {
|
||||||
|
_ = p.Get()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func WithNew[T any](nfn func() *T) opts.GOptionFnc[GPool[T]] {
|
||||||
|
return func(p *GPool[T]) {
|
||||||
|
p.createFn = nfn
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func WithCap[T any](cap int32) opts.GOptionFnc[GPool[T]] {
|
||||||
|
return func(p *GPool[T]) {
|
||||||
|
atomic.StoreInt32(&p.cap, cap)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func WithLen[T any](len int32) opts.GOptionFnc[GPool[T]] {
|
||||||
|
return func(p *GPool[T]) {
|
||||||
|
if p.createFn == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c := p.Cap()
|
||||||
|
if c != -1 && len > c {
|
||||||
|
len = c
|
||||||
|
}
|
||||||
|
for i := int32(0); i < len; i++ {
|
||||||
|
p.Put(p.createFn())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func WithSet[T any](els ...*T) opts.GOptionFnc[GPool[T]] {
|
||||||
|
return func(p *GPool[T]) {
|
||||||
|
for _, e := range els {
|
||||||
|
if e != nil {
|
||||||
|
p.Put(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name call_sizes.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 17/01/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package pools
|
||||||
|
|
||||||
|
type (
|
||||||
|
PoolCallSize struct {
|
||||||
|
Size uint64
|
||||||
|
Calls uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
PoolCallSizes []PoolCallSize
|
||||||
|
)
|
||||||
|
|
||||||
|
func (c PoolCallSizes) Len() int {
|
||||||
|
return len(c) }
|
||||||
|
|
||||||
|
|
||||||
|
func (c PoolCallSizes) Less(i, j int) bool {
|
||||||
|
return c[i].Calls > c[j].Calls }
|
||||||
|
|
||||||
|
|
||||||
|
func (c PoolCallSizes) Swap(i, j int) {
|
||||||
|
c[i], c[j] = c[j], c[i] }
|
||||||
@ -0,0 +1,39 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project atila
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name pool_stats.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/02/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package pools
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
PoolStats interface {
|
||||||
|
|
||||||
|
Created () uint64
|
||||||
|
Acquired() uint64
|
||||||
|
Released() uint64
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue