#!/usr/bin/perl
use 5.016;
use warnings;

package _Stream;

sub new {
	my $class = shift;
	return bless [ @_ ], $class;
}

sub value { $_[0]->[0] }
sub next { ref $_[0]->[1] eq 'CODE' ? $_[0]->[1] = $_[0]->[1]->() : $_[0]->[1] }

package main;

sub f_next {
	my ($c, $n) = @_;

	my $m = (
		(($n + 1) =~ m/^$c/) ?
			$n + (($n + 1) % 10 ? 1 : 2) :
			$c * 10 ** length($n) + 1
	);

	return _Stream->new($n, sub{ f_next($c, $m) });
}

sub g_next {
	my ($n, @f) = @_;

	return _Stream->new(
		$f[$n]->value,
		sub{
			g_next(
				$f[$n]->value % 10,
				@f[0 .. $n - 1],
				$f[$n]->next,
				@f[$n + 1 .. $#f]
			)
		}
	);
}

sub g { g_next(1, map{ f_next($_, $_) } (0 .. 9)) }

my $g = g();
my $i = $g->value;
while($i < 1001){
	$i = $g->value;
	$g = $g->next;
	print $i, ' ';
}
