@@ -1112,19 +1112,28 @@ julia> AbstractPPL.prefix(@varname(x.a), @varname(y[1]))
11121112y[1].x.a
11131113```
11141114"""
1115- function prefix (vn:: VarName{sym_vn} , prefix:: VarName{sym_prefix} ) where {sym_vn,sym_prefix}
1115+ function prefix (
1116+ vn:: VarName{sym_vn,Toptic_vn} , prefix:: VarName{sym_prefix,Toptic_prefix}
1117+ ) where {sym_vn,sym_prefix,Toptic_vn,Toptic_prefix}
11161118 optic_vn = getoptic (vn)
11171119 optic_prefix = getoptic (prefix)
1118- # Special case `identity` to avoid having ComposedFunctions with identity
1119- if optic_vn == identity
1120- new_inner_optic_vn = PropertyLens {sym_vn} ()
1121- else
1122- new_inner_optic_vn = optic_vn ∘ PropertyLens {sym_vn} ()
1123- end
1124- if optic_prefix == identity
1125- new_optic_vn = new_inner_optic_vn
1126- else
1127- new_optic_vn = new_inner_optic_vn ∘ optic_prefix
1128- end
1129- return VarName {sym_prefix} (new_optic_vn)
1120+ new_optic = (optic_vn ∘ PropertyLens {sym_vn} ()) ∘ optic_prefix
1121+ return VarName {sym_prefix} (new_optic)
1122+ end
1123+ function prefix (
1124+ :: VarName{sym_vn,typeof(identity)} , prefix:: VarName{sym_prefix,Toptic_prefix}
1125+ ) where {sym_vn,sym_prefix,Toptic_prefix}
1126+ new_optic = PropertyLens {sym_vn} () ∘ getoptic (prefix)
1127+ return VarName {sym_prefix} (new_optic)
1128+ end
1129+ function prefix (
1130+ vn:: VarName{sym_vn,Toptic_vn} , :: VarName{sym_prefix,typeof(identity)}
1131+ ) where {sym_vn,sym_prefix,Toptic_vn}
1132+ new_optic = getoptic (vn) ∘ PropertyLens {sym_vn} ()
1133+ return VarName {sym_prefix} (new_optic)
1134+ end
1135+ function prefix (
1136+ :: VarName{sym_vn,typeof(identity)} , :: VarName{sym_prefix,typeof(identity)}
1137+ ) where {sym_vn,sym_prefix}
1138+ return VarName {sym_prefix} (PropertyLens {sym_vn} ())
11301139end
0 commit comments