[[!comment format=mdwn
 username="joey"
 subject="""comment 2"""
 date="2016-03-08T18:44:25Z"
 content="""
I've made a typed-os-requirements branch that has type-level
OS lists implemented.

For example:

	*Propellor.Types.OS.TypeLevel> let l = (debian `combineSupportedOS` freeBSD ) `intersectSupportedOS` unixlike
	*Propellor.Types.OS.TypeLevel> l
	OSList [OSDebian,OSFreeBSD]
	*Propellor.Types.OS.TypeLevel> :t l
	l :: OSList
	       (IntersectOSList
	          '[] '['OSDebian, 'OSFreeBSD] '['OSDebian, 'OSBuntish, 'OSFreeBSD])

What this is lacking is type-level equality for OSList.
The complicated type above should be equivilant to `OSList '[OSDebian, OSFreeBSD]`

So, this doesn't type check yet:

	foo :: OSList '[OSDebian, OSFreeBSD]
	foo = (debian `combineSupportedOS` freeBSD ) `intersectSupportedOS` unixlike 

	src/Propellor/Types/OS/Typelevel.hs:47:46:
	    Couldn't match expected type ‘IntersectOSList
	                                    '[]
	                                    '['OSDebian, 'OSFreeBSD]
	                                    '['OSDebian, 'OSBuntish, 'OSFreeBSD]’
	                with actual type ‘'['OSDebian, 'OSFreeBSD]’
	    In the expression:
	      (debian `combineSupportedOS` freeBSD)
	      `intersectSupportedOS` unixlike
	    In an equation for ‘foo’:
	        foo
	          = (debian `combineSupportedOS` freeBSD)
	            `intersectSupportedOS` unixlike

Also, `intersectSupportedOS` should have an additional constraint,
to prevent it from generating an empty type-level list.
"""]]
