interface ĠA Ġ{ ĊĠĠĠ Ġfun Ġfoo () Ċ } Ċ Ċ interface ĠB Ġ{ ĊĠĠĠ Ġfun Ġbar () Ċ } Ċ Ċ interface ĠC Ġ{ ĊĠĠĠ Ġfun Ġbaz () Ċ } Ċ Ċ interface ĠInv < K , ĠT >() Ġ{ ĊĠĠĠ Ġfun Ġk (): ĠK ĊĠĠĠ Ġfun Ġt (): ĠT Ċ } Ċ Ċ type alias ĠInv 0 Ġ= ĠInv < A , ĠB > Ċ type alias ĠInv 1 < X > Ġ= ĠInv < A , ĠX > Ċ type alias ĠInv 2 < X , ĠY > Ġ= ĠInv < X , ĠY > Ċ type alias ĠInv 3 < X , ĠY , ĠZ > Ġ= ĠInv < X , ĠZ > Ċ Ċ fun Ġtest Base ( inv : ĠInv < A , ĠB >) Ġ{ ĊĠĠĠ Ġinv . k () ĊĠĠĠ Ġinv . t () Ċ } Ċ Ċ fun Ġtest _ 0 ( inv : ĠInv 0 ) Ġ{ ĊĠĠĠ Ġinv . k (). foo () ĊĠĠĠ Ġinv . t (). bar () Ċ } Ċ Ċ fun Ġtest _ 1 ( inv : ĠInv 1 < B >) Ġ{ ĊĠĠĠ Ġinv . k (). foo () ĊĠĠĠ Ġinv . t (). bar () Ċ } Ċ Ċ fun Ġtest _ 2 ( inv : ĠInv 2 < A , ĠB >) Ġ{ ĊĠĠĠ Ġinv . k (). foo () ĊĠĠĠ Ġinv . t (). bar () Ċ } Ċ Ċ fun Ġtest _ 3 ( inv : ĠInv 3 < A , ĠB , ĠC >) Ġ{ ĊĠĠĠ Ġinv . k (). foo () ĊĠĠĠ Ġinv . t (). <! UN RESOL VED _ REFERENCE !> bar <! >() ĊĠĠĠ Ġinv . t (). baz () Ċ } Ċ Ċ type alias ĠInv 0 2 < A 1 , ĠB 1 , ĠC 1 > Ġ= ĠInv < Inv < A 1 , ĠB 1 >, ĠC 1 > Ċ Ċ fun Ġtest _ 4 ( inv : ĠInv 0 2 < A , ĠB , ĠC >) Ġ{ ĊĠĠĠ Ġinv . k (). k (). foo () ĊĠĠĠ Ġinv . k (). t (). bar () ĊĠĠĠ Ġinv . t (). baz () Ċ } Ċ Ċ interface ĠIn < in ĠT > Ġ{ ĊĠĠĠ Ġfun Ġtake ( x : ĠT ) Ċ } Ċ interface ĠOut < out ĠT > Ġ{ ĊĠĠĠ Ġfun Ġvalue (): ĠT Ċ } Ċ Ċ interface ĠIn variant < T > Ġ{ ĊĠĠĠ Ġfun Ġtake ( x : ĠT ) ĊĠĠĠ Ġfun Ġvalue (): ĠT Ċ } Ċ Ċ type alias ĠIn 1 < X > Ġ= ĠIn < X > Ċ type alias ĠOut 1 < X > Ġ= ĠOut < X > Ċ type alias ĠIn variant 1 < X > Ġ= ĠIn variant < X > ĊĊ Ċ fun Ġtest _ 5 ( a : ĠA , Ġin 1 : ĠIn 1 < A >, Ġin 2 : ĠIn 1 < in ĠA >, Ġin 3 : ĠIn 1 < out ĠA >) Ġ{ ĊĠĠĠ Ġin 1 . take ( a ) ĊĠĠĠ Ġin 2 . take ( a ) ĊĠĠĠ Ġin 3 .< ! UN RESOL VED _ REFERENCE !> take <! >( a ) Ċ } Ċ Ċ fun Ġtest _ 6 ( a : ĠA , Ġout 1 : ĠOut 1 < A >, Ġout 2 : ĠOut 1 < in ĠA >, Ġout 3 : ĠOut 1 < out ĠA >) Ġ{ ĊĠĠĠ Ġout 1 . value (). foo () ĊĠĠĠ Ġout 2 .< ! UN RESOL VED _ REFERENCE !> value <! >(). <! UN RESOL VED _ REFERENCE !> foo <! >() ĊĠĠĠ Ġout 3 . value (). foo () Ċ } Ċ Ċ fun Ġtest _ 7 ( a : ĠA , Ġinv 1 : ĠIn variant 1 < A >, Ġinv 2 : ĠIn variant 1 < in ĠA >, Ġinv 3 : ĠIn variant 1 < out ĠA >) Ġ{ ĊĠĠĠ Ġinv 1 . value (). foo () ĊĠĠĠ Ġinv 2 . value (). <! UN RESOL VED _ REFERENCE !> foo <! >() ĊĠĠĠ Ġinv 3 . value (). foo () ĊĊĠĠĠ Ġinv 1 . take ( a ) ĊĠĠĠ Ġinv 2 . take ( a ) ĊĠĠĠ Ġinv 3 .< ! IN AP PL IC ABLE _ C AND ID ATE !> take <! >( a ) Ċ }