Skip to content

Small Julia language utilities I find myself reimplementing frequently

License

Notifications You must be signed in to change notification settings

Kiruse/KirUtils

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

KirUtils

KirUtils is a collection of simple data structures & algorithms which I find myself commonly reimplementing in various projects. For example, the Ident{:symbol} meta type can be used effectively in multiple dispatch to act as a switch statement, and the Unknown type represents a value which may or may not be loaded.

Types

Ident

Ident is short for Identifier. It is primarily intended to be used with Symbols, and allows the Julia runtime to dispatch a function call based on symbol values by wrapping it in a meta type. This allows building a switch-like family of functions:

using KirUtils.Idents

struct Foo
  name
end

my_dispatcher(foo::Foo) = _dispatched(Ident{foo.name}())

_dispatched(::Ident{:SomeValue}) = "some value"
_dispatched(::Ident{:OtherValue}) = "other value"
_dispatched(::Ident{42}) = 42

println(my_dispatcher(Foo(42)))
# 42

Unknown

Unknown{T} represents a value of type T which may or may not be currently loaded. When unloaded, its value will be unknown, which is an instance of Unknown{Nothing}. You may test whether an Unknown is loaded by comparing its value against unknown, or by calling isunknown(my_unknown).

You can simply assign the value of an Unknown or clear it by assigning unknown to it. Alternatively, you may call KirUtils.Unknowns.load to load the value using the assigned loader, if any; and KirUtils.Unknowns.unload to clear the value.

Unknowns are especially useful for locally resembling a remote value for which retrieval may cost valuable runtime. This applies to both values retrieved from a remote database, but also values stored elsewhere in the local system such as the filesystem or in a GPU buffer.

using KirUtils.Unknowns

# initially unloaded Unknown{Any}
val = Unknown()

# Unknown{Int}
val = Unknown(42)

# Unknown{Any} w/ loader
val = Unknown(() -> 42)

# load "remote" value
Unknowns.load(val)
println(val.value) # 42

# unload cached value - equivalent to `val.value = unknown`
Unknowns.unload(val)
println(val.value) # unknown

About

Small Julia language utilities I find myself reimplementing frequently

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Languages