// RUN: %target-typecheck-verify-swift -swift-version 4

func flatMapOnSequence<
  S : Sequence
>(xs: S, f: (S.Element) -> S.Element?) {
  _ = xs.flatMap(f) // expected-warning {{'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value}} expected-note {{compactMap}}
}

func flatMapOnLazySequence<
  S : LazySequenceProtocol
>(xs: S, f: (S.Element) -> S.Element?) {
  _ = xs.flatMap(f) // expected-warning {{'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value}} expected-note {{compactMap}}
}

func flatMapOnLazyCollection<
  C : LazyCollectionProtocol
>(xs: C, f: (C.Element) -> C.Element?) {
  _ = xs.flatMap(f) // expected-warning {{'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value}} expected-note {{compactMap}}
}

func flatMapOnLazyBidirectionalCollection<
  C : LazyCollectionProtocol & BidirectionalCollection
>(xs: C, f: (C.Element) -> C.Element?)
where C.Elements : BidirectionalCollection {
  _ = xs.flatMap(f) // expected-warning {{'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value}} expected-note {{compactMap}}
}

func flatMapOnCollectinoOfStrings<
  C : Collection
>(xs: C, f: (C.Element) -> String?) {
  _ = xs.flatMap(f) // expected-warning {{'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value}} expected-note {{compactMap}}
}
