Skip to content

Commit 7ca59b9

Browse files
authored
Generalize IN for any sequence of expressions (pointfreeco#87)
* Generalize `IN` for any sequence of expressions It was hard-coded to arrays. * wip
1 parent a4eeff6 commit 7ca59b9

File tree

1 file changed

+13
-13
lines changed

1 file changed

+13
-13
lines changed

Sources/StructuredQueriesCore/Operators.swift

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -832,8 +832,9 @@ extension QueryExpression where QueryValue: QueryBindable {
832832
///
833833
/// - Parameter expression: A sequence of expressions.
834834
/// - Returns: A predicate expression indicating whether this expression is in the given sequence
835-
public func `in`(_ expression: [some QueryExpression<QueryValue>]) -> some QueryExpression<Bool> {
836-
BinaryOperator(lhs: self, operator: "IN", rhs: Array.Expression(elements: expression))
835+
public func `in`<S: Sequence>(_ expression: S) -> some QueryExpression<Bool>
836+
where S.Element: QueryExpression<QueryValue> {
837+
BinaryOperator(lhs: self, operator: "IN", rhs: S.Expression(elements: expression))
837838
}
838839

839840
/// Returns a predicate expression indicating whether the expression is in a subquery.
@@ -868,7 +869,7 @@ extension QueryExpression where QueryValue: QueryBindable {
868869
}
869870
}
870871

871-
extension Array where Element: QueryBindable {
872+
extension Sequence where Element: QueryBindable {
872873
/// Returns a predicate expression indicating whether the sequence contains the given expression.
873874
///
874875
/// An alias for ``QueryExpression/in(_:)``, flipped.
@@ -977,16 +978,15 @@ private struct LikeOperator<
977978
}
978979
}
979980

980-
extension Array where Element: QueryExpression, Element.QueryValue: QueryBindable {
981-
fileprivate struct Expression: QueryExpression {
982-
typealias QueryValue = Array
981+
extension Sequence where Element: QueryExpression, Element.QueryValue: QueryBindable {
982+
fileprivate typealias Expression = _SequenceExpression<Self>
983+
}
983984

984-
let elements: [Element]
985-
init(elements: [Element]) {
986-
self.elements = elements
987-
}
988-
var queryFragment: QueryFragment {
989-
"(\(elements.map(\.queryFragment).joined(separator: ", ")))"
990-
}
985+
private struct _SequenceExpression<S: Sequence>: QueryExpression
986+
where S.Element: QueryExpression, S.Element.QueryValue: QueryBindable {
987+
typealias QueryValue = S
988+
let queryFragment: QueryFragment
989+
init(elements: S) {
990+
queryFragment = "(\(elements.map(\.queryFragment).joined(separator: ", ")))"
991991
}
992992
}

0 commit comments

Comments
 (0)