-- | Module with basic infrastructure for function inheritance-- based on open rercusion.---- See the work of William Cook.---- We use the following terminology.---- * A /closed/ function is an ordinary function. ---- * A /mixin/ function is an open function that can be-- inherited from, or that extends another open function.---- We obtain a closed function from a base mixin 'base'-- and a number of mixin extensions 'e1',...,'en' as follows:---- > mixin (en <@> ... <@> e1 <@> base)-- moduleControl.Mixin.Mixin(Mixin,(<@>),mixin,mixinId,mixinLift)whereinfixl5<@>-- | Type of mixin functions.typeMixina=a-- the 'super' function->a-- the 'this' function->a-- the current function-- | Mixin composition.(<@>)::Mixina->Mixina->Mixina(f1<@>f2)superthis=f1(f2superthis)this-- | Turn a mixin into a closed function.mixin::Mixina->amixinopenF=letclosedF=openFerrorFclosedFerrorF=error$"super called in base mixin"inclosedF-- | Mixin identity function.---- Identity for mixin composition:-- -- -- > mixinId <@> f == f-- > f <@> mixinId == f-- mixinId::MixinamixinIdsuperthis=super-- | Mixin lift function---- > mixin . mixinLift = idmixinLift::(a->b)->Mixin(a->b)mixinLiftf__=f