RaCoCo result: Red::AST::DateTimeFuncs

# Red::AST::DateTimeFuncs 40%

    use Red::AST;
    use Red::AST::Value;
    use Red::AST::Function;

    #| Base role for date time functions
    role Red::AST::DateTimeFunction does Red::AST {
        method default-implementation {...}

    }
    enum Red::AST::DateTime::Part (
            year   => "%Y",
            month  => "%m",
            day    => "%d",
            hour   => "%H",
            minute => "%M",
            second => "%S",
    );

    #| Represents a function that extracts a part of a date time
    class Red::AST::DateTimePart does Red::AST::DateTimeFunction {
        has Red::AST                 $.base;
        has Red::AST::DateTime::Part $.part;

        method returns { Str }
        method find-column-name {
            $!base.find-column-name
        }
        method args {$!base, $!part}

        method default-implementation {

            Red::AST::Function.new:
                    :func<STRFTIME>,
                    :args[
                        ast-value($!part.value),
                        Red::AST::Function.new:
                            :func<DATE>,
                            :args[ $!base ],
                    ]
        }
    }

    #| Coerce a DateTime, timestamp etc to just date for comparisons
    class Red::AST::DateTimeCoerce does Red::AST::DateTimeFunction {
        has Red::AST                 $.base;

        method returns { Str }
        method find-column-name {
            $!base.find-column-name
        }
        method args {$!base}

        method default-implementation {
            Red::AST::Function.new:
                :func<DATE>,
                :args[ $!base ];
        }
    }