diff --git a/errors.go b/errors.go new file mode 100644 index 0000000..3b3ea65 --- /dev/null +++ b/errors.go @@ -0,0 +1,11 @@ +package iid + +import ( + "errors" +) + +var ( + errBadRequest = errors.New("iid: bad request") + errNilReceiver = errors.New("iid: nil receiver") + errNothing = errors.New("iid: nothing") +) diff --git a/iid.go b/iid.go new file mode 100644 index 0000000..e683e85 --- /dev/null +++ b/iid.go @@ -0,0 +1,86 @@ +package iid + +// IID represents an interaction‐identifier — i.e., an interaction‐ID — i.e., an IID. +// +// It is a scheme used to generate quazi‐monotonically‐increasing‐unique. +type IID struct { + value uint64 + loaded bool +} + +func Nothing() IID { + return IID{} +} + +func something(value uint64) IID { + return IID{ + value:value, + loaded:true, + } +} + +// Generate creates a new interaction‐identifier — i.e., an interaction‐ID — i.e., an IID. +func Generate() IID { + + var value uint64 = generate() + + return something(value) +} + +// Chaos returns the randomness that is embeddd in the interaction‐identifier — i.e., an interaction‐ID — i.e., an IID. +func (receiver IID) Chaos() (uint64, bool) { + if Nothing() == receiver { + return 0, false + } + + _, value := decompile(receiver.value) + + return value, true +} + +func (receiver IID) String() string { + if Nothing() == receiver { + return "" + } + + var serialized string = serialize(receiver.value) + + return serialized +} + +func (receiver IID) MarshalText() (text []byte, err error) { + if Nothing() == receiver { + return nil, errNothing + } + + var serialized string = serialize(receiver.value) + + return []byte(serialized), nil +} + +// UnixTime returns the unix‐time that is embeddd in the interaction‐identifier — i.e., an interaction‐ID — i.e., an IID. +func (receiver IID) UnixTime() (int64, bool) { + if Nothing() == receiver { + return 0, false + } + + value, _ := decompile(receiver.value) + + return int64(value), true +} + +func (receiver *IID) UnmarshalText(p []byte) error { + if nil == receiver { + return errNilReceiver + } + + var serialized string = string(p) + + value, successful := unserialize(serialized) + if !successful { + return errBadRequest + } + + *receiver = something(value) + return nil +}