migrate

migrate (Supply 사이 전환)

실시간 데이터를 다룰 때, 여러 데이터 소스 사이를 전환해야 하는 상황이 있어요. 주식 시세처럼 "지금 보고 있는 대상"이 바뀔 때마다 기존 연결은 닫고 새 연결만 챙기고 싶다면, migrate 메서드가 그 전환을 깔끔하게 처리해줘요.

출처: Raku Documentation — migrate

본문

Supply에서

method migrate(Supply:D: --> Supply:D)

값이 Supply 타입인 Supply를 입력으로 받아요. 바깥 Supply가 새 Supply를 방출할 때마다 그 Supply를 탭하고 그 값을 방출해요. 이전에 탭했던 Supply는 닫혀요. 서로 다른 데이터 소스 사이를 옮겨 다니면서 가장 최신 것만 주목할 때 유용하죠.

예를 들어 사용자가 여러 주식 사이를 전환할 수 있는 앱을 떠올려볼게요. 새 주식으로 전환하면 웹소켓에 연결해서 최신 값을 받고, 이전 연결은 닫아야 해요. 웹소켓으로 들어오는 각 값 스트림은 Supply로 표현되는데, 이 Supply들이 다시 "지켜볼 최신 데이터 소스"를 갖는 하나의 Supply로 방출돼요. migrate 메서드로 이 supply들의 supply를 사용자가 관심을 갖는 현재 값의 단일 Supply로 평탄화할 수 있어요.

이런 프로그램의 간단한 시뮬레이션이에요.

my Supplier $stock-sources .= new;

sub watch-stock($symbol) {
    $stock-sources.emit: supply {
        say "Starting to watch $symbol";
        whenever Supply.interval(1) {
            emit "$symbol: 111." ~ 99.rand.Int;
        }
        CLOSE say "Lost interest in $symbol";
    }
}

$stock-sources.Supply.migrate.tap: *.say;

watch-stock('GOOG');
sleep 3;
watch-stock('AAPL');
sleep 3;

그러면 다음과 같은 출력이 나와요.

Starting to watch GOOG
GOOG: 111.67
GOOG: 111.20
GOOG: 111.37
Lost interest in GOOG
Starting to watch AAPL
AAPL: 111.55
AAPL: 111.6
AAPL: 111.6