use Red::AST;
use Red::Column;

#| Represents a value
class Red::AST::Value does Red::AST is Any {
    has             $.value is required;
    has Red::Column $.column;
    has Mu:U        $.type = $!value.WHAT; # $!column.DEFINITE ?? $!column.attr.type !! $!value.WHAT

    method gist { $!value.gist }
    method returns { $!type }

    method args { $!value }

    method find-value { $!value }

    method find-column-name {}

    method get-value() {
        do if $!column.DEFINITE {
            $!column.deflate.($!value)
        } else {
            $!value
        }
    }
}

multi ast-value(Red::AST $value) is export {
    $value
}

multi ast-value($value, :$type = $value.WHAT) is export {
    Red::AST::Value.new: :$value, :$type
}

multi ast-value($value, Mu :$type!) is export {
    Red::AST::Value.new: :$value, :type(Any)
}