summaryrefslogtreecommitdiff
path: root/src/Propellor/Types
diff options
context:
space:
mode:
Diffstat (limited to 'src/Propellor/Types')
-rw-r--r--src/Propellor/Types/Target.hs41
1 files changed, 27 insertions, 14 deletions
diff --git a/src/Propellor/Types/Target.hs b/src/Propellor/Types/Target.hs
index 40b3891e..e4d8c9c1 100644
--- a/src/Propellor/Types/Target.hs
+++ b/src/Propellor/Types/Target.hs
@@ -3,6 +3,11 @@
module Propellor.Types.Target (
Target(..),
Targeting(..),
+ mkProperty,
+ mkProperty',
+ OuterTarget,
+ ensureProperty,
+ orProperty,
target,
UnixLike,
unixLike,
@@ -14,8 +19,6 @@ module Propellor.Types.Target (
freeBSD,
unionTargets,
intersectTarget,
- orProperty,
- ensureProperty,
) where
import Network.BSD (HostName)
@@ -25,8 +28,22 @@ import Data.List
data Property target = Property target (IO ())
-mkProperty :: IO () -> Property UnixLike
-mkProperty a = Property unixLike a
+mkProperty :: Targeting targets -> IO () -> Property (Targeting targets)
+mkProperty target a = Property target a
+
+mkProperty' :: Targeting targets -> (OuterTarget targets -> IO ()) -> Property (Targeting targets)
+mkProperty' target@(Targeting l) a = Property target (a (OuterTarget l))
+
+data OuterTarget (targets :: [Target]) = OuterTarget [Target]
+
+-- | Use `mkProperty'` to get the `OuterTarget`. Only properties whose
+-- targets are a superset of the outer targets can be ensured.
+ensureProperty
+ :: ((innertargets `NotSupersetTargets` outertargets) ~ CanCombineTargets)
+ => OuterTarget outertargets
+ -> Property (Targeting innertargets)
+ -> IO ()
+ensureProperty outertarget (Property innertarget a) = a
-- | Changes the target of a property.
--
@@ -61,15 +78,19 @@ orProperty a@(Property ta ioa) b@(Property tb iob) =
-- ensureProperty supportedos jail
-- where supportedos = unionTargets debian freeBSD
+foo :: Property (Targeting '[OSFreeBSD])
+foo = mkProperty' freeBSD $ \t -> do
+ ensureProperty t jail
+
--bar :: Property (Targeting '[OSDebian, OSFreeBSD])
bar = aptinstall `orProperty` jail
aptinstall :: Property DebianOnly
-aptinstall = target debian $ mkProperty $ do
+aptinstall = mkProperty debian $ do
return ()
jail :: Property FreeBSDOnly
-jail = target freeBSD $ mkProperty $ do
+jail = mkProperty freeBSD $ do
return ()
----- END DEMO ----------
@@ -104,14 +125,6 @@ freeBSD = targeting OSFreeBSD
targeting :: Target -> Targeting os
targeting o = Targeting [o]
--- The outertarget parameter needs to be passed in from the outer property.
-ensureProperty
- :: ((innertarget `NotSupersetTargets` outertarget) ~ CanCombineTargets)
- => Targeting outertarget
- -> Property (Targeting innertarget)
- -> IO ()
-ensureProperty outertarget (Property inneros a) = a
-
-- | The union of two lists of Targets.
unionTargets
:: Targeting l1