From 56c3394144abbb9862dc67379d3253c76ae4df97 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 27 Oct 2015 14:34:10 -0400 Subject: Explicit Info/NoInfo for RevertableProperty (API change) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RevertableProperty used to be assumed to contain info, but this is now made explicit, with RevertableProperty HasInfo or RevertableProperty NoInfo. Transition guide: - If you define a RevertableProperty, expect some type check failures like: "Expecting one more argument to ‘RevertableProperty’". - Change it to "RevertableProperty NoInfo" - The compiler will then tell you if it needs "HasInfo" instead. - If you have code that uses the RevertableProperty constructor that fails to type check, use the more powerful operator --- doc/todo/RevertableProperty_with_NoInfo.mdwn | 30 ++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'doc') diff --git a/doc/todo/RevertableProperty_with_NoInfo.mdwn b/doc/todo/RevertableProperty_with_NoInfo.mdwn index 3b4a61a9..1aea0a04 100644 --- a/doc/todo/RevertableProperty_with_NoInfo.mdwn +++ b/doc/todo/RevertableProperty_with_NoInfo.mdwn @@ -16,3 +16,33 @@ a mouthful! Since only 2 places in the propellor source code currently need to deal with this, it doesn't currently seem worth making the change, unless a less intrusive way can be found. + +> Hmm.. I'm not sure what I meant by that last paragraph, but I'm sure +> this wart is annoying in more than 2 places by now. --[[Joey]] + +> Would be nice to instead have `RevertableProperty i`, where the i was inherited +> from the currently active property. This would be less of a mouthful, +> and models the info transfer correctly. Ie, if I have a +> RevertableProperty that includes dns settings on its setup side, +> reverting it means dropping those dns settings, so the result is NoInfo. + +> Unfortunately, when I tried to implement this, the types prevented it. +> In particular, anything to do with the second property in a +> `RevertableProperty i` is a problem because we don't know what +> type of Property it is. For example: + + data RevertableProperty i where + RIProperty :: Property HasInfo -> Property i -> RevertableProperty HasInfo + RSProperty :: Property NoInfo -> Property i -> RevertableProperty NoInfo + + activeProperty :: RevertableProperty i -> Property i + activeProperty (RIProperty p _) = p + activeProperty (RSProperty p _) = p + + inactiveProperty :: RevertableProperty i -> Property x + +> The x is unknown and cannot be deduced from the available types. +> +> What could be done, instead, is to make a `RevertableProperty i` specify +> the info of both its sides. While this doesn't perfectly model +> the info propigation, the types work. [[done]] --[[Joey]] -- cgit v1.3-2-g0d8e