def withServiceA
(x
: => Unit
)(implicit e
: TA
=:= TFalse
) = {x
; new Myclass
[TTrue, TB, TC
]} def withServiceB
(x
: => Unit
)(implicit e
: TB
=:= TFalse
) = {x
; new Myclass
[TA, TTrue, TC
]} def withServiceC
(x
: => Unit
)(implicit e
: TC
=:= TFalse
) = {x
; new Myclass
[TA, TB, TTrue
]} def withClient
(x
: => Unit
)(implicit e1
: TA
=:= TTrue, e2
: TB
=:= TTrue
) = x
}
def apply
(c
: Context
) = new Myclass
[TFalse, TFalse, TFalse
] }
def withContext
(f
: Context
=> Myclass
[TTrue, TTrue,
_])(withClient
: => Unit
) = f
(new Context
).
withClient(withClient
) }
Context
.withContext(
Myclass(_)
.withServiceA(println("with A"))
.withServiceC(println("with C"))
.withServiceB(println("with B"))
)(println("withClient"))
}
b2JqZWN0IE1haW4gZXh0ZW5kcyBBcHAgewogIHRyYWl0IFRUcnVlCiAgdHJhaXQgVEZhbHNlCgogIGNsYXNzIE15Y2xhc3NbVEEsIFRCLCBUQ10gcHJpdmF0ZSgpewogICAgZGVmIHdpdGhTZXJ2aWNlQSh4OiA9PiBVbml0KShpbXBsaWNpdCBlOiBUQSA9Oj0gVEZhbHNlKSA9IHt4OyBuZXcgTXljbGFzc1tUVHJ1ZSwgVEIsIFRDXX0KICAgIGRlZiB3aXRoU2VydmljZUIoeDogPT4gVW5pdCkoaW1wbGljaXQgZTogVEIgPTo9IFRGYWxzZSkgPSB7eDsgbmV3IE15Y2xhc3NbVEEsIFRUcnVlLCBUQ119CiAgICBkZWYgd2l0aFNlcnZpY2VDKHg6ID0+IFVuaXQpKGltcGxpY2l0IGU6IFRDID06PSBURmFsc2UpID0ge3g7IG5ldyBNeWNsYXNzW1RBLCBUQiwgVFRydWVdfQogICAgZGVmIHdpdGhDbGllbnQoeDogPT4gVW5pdCkoaW1wbGljaXQgZTE6IFRBID06PSBUVHJ1ZSwgZTI6IFRCID06PSBUVHJ1ZSkgPSB4CiAgfQoKICBvYmplY3QgTXljbGFzc3sKICAgIGRlZiBhcHBseShjOiBDb250ZXh0KSA9IG5ldyBNeWNsYXNzW1RGYWxzZSwgVEZhbHNlLCBURmFsc2VdCiAgfQoKICBzZWFsZWQgY2xhc3MgQ29udGV4dCBwcml2YXRlKCkKICBvYmplY3QgQ29udGV4dCB7CiAgICAgZGVmIHdpdGhDb250ZXh0KGY6IENvbnRleHQgPT4gTXljbGFzc1tUVHJ1ZSwgVFRydWUsIF9dKSh3aXRoQ2xpZW50OiA9PiBVbml0KSA9CiAgICAgICBmKG5ldyBDb250ZXh0KS53aXRoQ2xpZW50KHdpdGhDbGllbnQpCiAgfQoKICBDb250ZXh0CiAgICAud2l0aENvbnRleHQoCiAgICAgIE15Y2xhc3MoXykKICAgICAgICAud2l0aFNlcnZpY2VBKHByaW50bG4oIndpdGggQSIpKQogICAgICAgIC53aXRoU2VydmljZUMocHJpbnRsbigid2l0aCBDIikpCiAgICAgICAgLndpdGhTZXJ2aWNlQihwcmludGxuKCJ3aXRoIEIiKSkKICAgICkocHJpbnRsbigid2l0aENsaWVudCIpKQp9