2017-11-26 12 views
2

から一つのストリームを引くには、次の操作を行うことができますエリクサーで他の

iex> [1,2,3,4] -- [2,3] 
[1,4] 

Streamタイプのためanalagous機能はありますか?これを実装しようとすると

は、私が持っている:[&1]がリストではなく、ストリームであるとして

def stream_subtract(enum, []), do: Enum.to_list(enum) 

    def stream_subtract(enum1, enum2) do 
    head = Stream.take(enum2, 1) 
    new_enum1 = Stream.drop_while(enum1, &([&1] == head)) 
    stream_subtract(new_enum1, Stream.drop(enum2, 1)) 
    end 

しかしこれは、失敗します。

+0

あなたが本当にライブストリームに対処したい場合 - 一つのストリームは、他の関連する要素を待つ必要がある - そして、エリクサーの 'Flow'は、方法かもしれない前方ます。https: //hexdocs.pm/flow/Flow.html – GavinBrelstaff

答えて

4

要素が存在するかどうかをテストできるように、事前に2番目のストリームを収集する必要があります。これをMapSetに集め、それを使って最初のストリームをフィルタリングする方法は次のとおりです。

また、Stream.drop_whileはストリームの先頭からのみドロップされます。任意の位置からドロップする場合は、Stream.rejectを使用する必要があります。

# Our two streams 
foo = 1..10 |> Stream.take(4) 
bar = 1..10 |> Stream.drop(1) |> Stream.take(2) 

# Collect the second stream into a MapSet 
bar = bar |> Enum.into(MapSet.new) 

# Filter the first stream and print all items: 
foo = foo |> Stream.reject(fn x -> x in bar end) 
for f <- foo, do: IO.inspect(f) 

出力:

1 
4 
+0

ありがとうございます - ここでMapSetを使用すると、特に私にとっては教育的です。 – category

関連する問題