minivariant ~v2.x.x
A minimal D library to expose a minimalistic tagged union
To use this package, run the following command in your project's root directory:
						Manual usage
						
						Put the following dependency into your project's dependences section:
					
Minivariant: Simple, focused variant library
Goal
Minivariant provides a simple way to work with a tagged union.
It aims to provide a replacement for std.variant.Algebraic, which is built on top of std.variant.Variant.
The issue that spawned this effort was the inability of Algebraic to work with basic type conversion,
e.g. it triggers a static assertion failure to assign an immutable int to an Algebraic containing an int.
Overview
The main type is geod24.variant : Variant. It takes a tuple of accepted parameters:
auto my_variant = Variant!(uint, char, bool, string)("Hello world");
It provides a pedestrian usage, via isType and peek, and a more structured approach via visit.
Example
This is the "pedestrian" usage:
@safe unittest
{
    // Default construction is forbidden
    // If you really need an empty Variant, use a dummy type
    auto variant = Variant!(uint, bool)(uint(42));
    // You can check the active type
    assert(variant.isType!uint);
    assert(!variant.isType!bool);
    // Even with types which are not part of the variant
    assert(!variant.isType!char);
    // You can peek a value
    if (auto valptr = variant.peek!uint)
        assert(*valptr == 42);
    if (auto valptr = variant.peek!bool)
        assert(0);
    if (auto valptr = variant.peek!int)
        assert(0);
}
The visit approach needs an externally constructed overload set, so regular overloaded functions, either in a module or an aggregate are okay:
public class ValueAsString
{
    import std.format;
    public static string opCall (T) (ref T value)
    {
        return format("%s %s", T.stringof, value);
    }
}
///
@safe unittest
{
    auto variant = Variant!(byte, char, string, bool)(byte(42));
    assert(variant.visit!ValueAsString == "byte 42");
    variant = true;
    assert(variant.visit!ValueAsString == "bool true");
    variant = "Hello World";
    assert(variant.visit!ValueAsString == "string Hello World");
}
- ~v2.x.x released a year ago
- Geod24/minivariant
- MIT
- Copyright © 2018, Mathias 'Geod24' Lang
- Authors:
- Dependencies:
- none
- Versions:
- 
						
 Show all 5 versions2.0.1 2019-Jan-18 2.0.0 2018-Dec-20 1.0.1 2018-Aug-07 1.0.0 2018-May-03 ~v2.x.x 2024-Feb-08 
- Download Stats:
- 
						- 
								0 downloads today 
- 
								3 downloads this week 
- 
								3 downloads this month 
- 
								16 downloads total 
 
- 
								
- Score:
- 0.7
- Short URL:
- minivariant.dub.pm