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]] [[!tag user/joey]] > [[done]]!! --[[Joey]]