11from __future__ import annotations
22
3- from typing import TYPE_CHECKING
3+ from typing import TYPE_CHECKING , Any , Generic
44
55from narwhals ._plan .common import Immutable
66
1010 from narwhals .dtypes import DType
1111 from narwhals .typing import NonNestedLiteral
1212
13+ from narwhals ._typing_compat import TypeVar
1314
14- class LiteralValue (Immutable ):
15+ T = TypeVar ("T" , default = Any )
16+ NonNestedLiteralT = TypeVar (
17+ "NonNestedLiteralT" , bound = "NonNestedLiteral" , default = "NonNestedLiteral"
18+ )
19+
20+
21+ class LiteralValue (Immutable , Generic [T ]):
1522 """https://github.com/pola-rs/polars/blob/dafd0a2d0e32b52bcfa4273bffdd6071a0d5977a/crates/polars-plan/src/plans/lit.rs#L67-L73."""
1623
1724 @property
@@ -31,11 +38,14 @@ def to_literal(self) -> Literal:
3138
3239 return Literal (value = self )
3340
41+ def unwrap (self ) -> T :
42+ raise NotImplementedError
43+
3444
35- class ScalarLiteral (LiteralValue ):
45+ class ScalarLiteral (LiteralValue [ NonNestedLiteralT ] ):
3646 __slots__ = ("dtype" , "value" )
3747
38- value : NonNestedLiteral
48+ value : NonNestedLiteralT
3949 dtype : DType
4050
4151 @property
@@ -47,8 +57,11 @@ def __repr__(self) -> str:
4757 return f"{ type (self .value ).__name__ } : { self .value !s} "
4858 return "null"
4959
60+ def unwrap (self ) -> NonNestedLiteralT :
61+ return self .value
62+
5063
51- class SeriesLiteral (LiteralValue ):
64+ class SeriesLiteral (LiteralValue [ "DummySeries" ] ):
5265 """We already need this.
5366
5467 https://github.com/narwhals-dev/narwhals/blob/e51eba891719a5eb1f7ce91c02a477af39c0baee/narwhals/_expression_parsing.py#L96-L97
@@ -69,6 +82,9 @@ def name(self) -> str:
6982 def __repr__ (self ) -> str :
7083 return "Series"
7184
85+ def unwrap (self ) -> DummySeries :
86+ return self .value
87+
7288
7389class RangeLiteral (LiteralValue ):
7490 """Don't need yet, but might push forward the discussions.
0 commit comments