Currently, properties don't indicate what OS, or OS's, they work with.

Using withOS means throwing a runtime error on an unsupported OS. Yuck.

Could the OS of a property be lifted to the type level?

If we had Property i '[OS] then combining properties would need to update the type-level OS list.

For example, Property i '[Debian, FreeBSD] combined with Property i '[Debian, Buntish] yields a Property i '[Debian] -- the intersection of the OS's supported by the combined properties.

And, combining two properties that demand different OS's would need to be a type error.

Another kind of property combination would be to glue two properties that support different OS's together, yielding a property that supports both, and so has both in its '[OS] type list, and that choses which to run using withOS.

The os property would need to yield a Property (os:[]), where the type level list contains a type-level eqivilant of the value passed to the property. Is that possible to do? Or, alternatively, could have less polymorphic osDebian etc properties replace the os property.

If a Host's list of properties, when all combined together, contains more than one element in its '[OS], that could be a type error, the OS of the Host is indeterminite. Which would be fixed by using the os property to specify.

On the other hand, if a Host's list of properties yields a single OS the type needs to be just Host. After all, propellor operates on a [Host]; if we had Host OS, the list couldn't contain host's with different OS's.

One way to do this would be to make a Host not contain a Property, but a Propellor Result. The list of Properties could be combined together, and the Propellor Result extracted from the resulting single property.


This is somewhat similar to type level port conflict detection.


Note that propellor needs to remain buildable with Debian stable's ghc 7.6.3. I was able to get the type level OS implementation backported to work with that version, with some added ugliness.

--Joey

done!! --Joey