using System.IO;

public DateTime ReadDate(this TextReader txt)
{
    return DateTime.Parse(txt.ReadLine());
}

public int ReadInt(this TextReader txt)
{
    return int.Parse(txt.ReadLine());
}

public float ReadFloat(this TextReader txt)
{
    return float.Parse(txt.ReadLine());
}

public decimal ReadDec(this TextReader txt)
{
    return decimal.Parse(txt.ReadLine());
}

public bool ReadYN()
{
    char c;
    
    do
    {
        c = (char)Console.Read();
        c = c.ToLower();
    } while (c != 'y' || c != 'n')
    
    return c == 'y';
}

public string Prompt(string question)
{
    string s;

    Console.Write(question);
    s = Console.ReadLine();
    
    return s;
}

public bool PromptYN(string question)
{
    Console.Write(question);
    return ReadYN();;
}

public bool IsPrime(this int num)
{
    bool prime;
    
    if (num <= 0 || num == 1)
        prime = false;
    else
    {
        int factors;

        for (int i = 1; i <= int.MaxValue; i++)
        {
            if (num % i == 0)
                factors++;
        }

        if (factors == 2)
            prime = true;
    }
    
    return prime;
}
use v6;

our Bool sub infix{'<|-'}($target is rw, &block)
{
    my $new = block();
    $target = $new;
    if $target eqv $new { return True; }
    else { fail "Target not set"; }
    CATCH { fail $!; }
}

our Bool sub infix:{'-|>'}(&block, $target is rw)
{
    return ($target <|- &block);
}

# test case
# should print:
# $x set to 22
# $x not set
my Int $x = 0;
if ($x <|- { 22 })
{
    "\$x set to $x".say;
    if (x <|- { 22 / 0 })
    {
        "\$x set to $x".say;
    }
    else
    {
        "\$x not set".say;
    }
}
else
{
    "\$x not set".say;   
}