@@ -88,6 +88,45 @@ given (using config: Config): Factory = MemoizingFactory(config)
8888An alias given can have type parameters and context parameters just like any other given,
8989but it can only implement a single type.
9090
91+ ## Abstract Givens
92+
93+ A given may be an abstract member, with the restriction that it must have an explicit name.
94+
95+ ``` scala
96+ trait HasOrd [T ]:
97+ given ord : Ord [T ]
98+ ```
99+
100+ ## More Structural Givens
101+
102+ If an alias given instance is analogous to a lazy val,
103+ and a structural given instance is analogous to an object,
104+ albeit an object with an explicit type,
105+ then a structural given may also be specified without an explicit type:
106+
107+ ``` scala
108+ class IntOrd extends Ord [Int ]:
109+ def compare (x : Int , y : Int ) =
110+ if x < y then - 1 else if x > y then + 1 else 0
111+
112+ given IntOrd ()
113+ ```
114+
115+ Compare this syntax to:
116+
117+ ``` scala
118+ object intOrd extends IntOrd ()
119+ ```
120+
121+ The empty parentheses are optional in the extends clause when defining a class,
122+ but are required when defining a given.
123+
124+ Further mixins are allowed as usual:
125+
126+ ``` scala
127+ given IntOrd () with OrdOps [Int ]
128+ ```
129+
91130## Given Macros
92131
93132Given aliases can have the ` inline ` and ` transparent ` modifiers.
@@ -191,4 +230,4 @@ of given instances:
191230- A _ structural instance_ contains one or more types or constructor applications,
192231 followed by ` with ` and a template body that contains member definitions of the instance.
193232- An _ alias instance_ contains a type, followed by ` = ` and a right-hand side expression.
194- - An _ abstract instance_ contains just the type, which is not followed by anything.
233+ - An _ abstract instance_ contains just the name and type, which is not followed by anything.
0 commit comments