@@ -12,6 +12,7 @@ module Functora.TagsFamily
12
12
13
13
-- * Accessors
14
14
-- $accessors
15
+ MaybeGetTag ,
15
16
GetTag ,
16
17
HasTag ,
17
18
@@ -69,7 +70,9 @@ type family lhs |&| rhs where
69
70
-- $accessors
70
71
-- Accessors
71
72
72
- type GetTag k tags = GetTagFamily ('Nothing :: Maybe k ) k tags tags
73
+ type MaybeGetTag k tags = MaybeGetTagFamily ('Nothing :: Maybe k ) k tags tags
74
+
75
+ type GetTag k tags = GetTagFamily k tags (MaybeGetTag k tags )
73
76
74
77
type HasTag (v :: k ) tags =
75
78
( SingI v ,
@@ -152,26 +155,38 @@ type family UnTagFamily member v tags prev next where
152
155
UnTagFamily member v tags (kv ': prev ) next =
153
156
UnTagFamily member v tags prev (kv ': next )
154
157
155
- type family GetTagFamily mv k tags prev where
156
- GetTagFamily ('Just (v :: k )) k _ '[] = v
157
- GetTagFamily 'Nothing k tags '[] =
158
+ type family MaybeGetTagFamily mv k tags prev where
159
+ MaybeGetTagFamily ('Just (v :: k )) k _ '[] = 'Just v
160
+ MaybeGetTagFamily 'Nothing _ _ '[] = 'Nothing
161
+ MaybeGetTagFamily ('Just v ) k tags ((k ':-> Sing v ) ': _ ) =
158
162
TypeError
159
- ( 'ShowType k
160
- ':<>: 'Text " key is missing in "
163
+ ( 'ShowType v
164
+ ':<>: 'Text " :: "
165
+ ':<>: 'ShowType k
166
+ ':<>: 'Text " tag conflicts with "
161
167
':<>: 'ShowType tags
162
168
)
163
- GetTagFamily ('Just v ) k tags ((k ':-> Sing v ) ': _ ) =
169
+ MaybeGetTagFamily 'Nothing k tags ((k ':-> Sing v ) ': next ) =
170
+ MaybeGetTagFamily ('Just v ) k tags next
171
+ MaybeGetTagFamily mv k tags (_ ': next ) =
172
+ MaybeGetTagFamily mv k tags next
173
+
174
+ type family GetTagFamily k tags mv where
175
+ GetTagFamily k _ ('Just (v :: k )) = v
176
+ GetTagFamily k tags ('Just v ) =
164
177
TypeError
165
178
( 'ShowType v
166
179
':<>: 'Text " :: "
167
180
':<>: 'ShowType k
168
181
':<>: 'Text " tag conflicts with "
169
182
':<>: 'ShowType tags
170
183
)
171
- GetTagFamily 'Nothing k tags ((k ':-> Sing v ) ': next ) =
172
- GetTagFamily ('Just v ) k tags next
173
- GetTagFamily mv k tags (_ ': next ) =
174
- GetTagFamily mv k tags next
184
+ GetTagFamily k tags 'Nothing =
185
+ TypeError
186
+ ( 'ShowType k
187
+ ':<>: 'Text " key is missing in "
188
+ ':<>: 'ShowType tags
189
+ )
175
190
176
191
--
177
192
-- TODO : NEED A PROPER INSTANCE!
0 commit comments