{-# LANGUAGE RankNTypes, FlexibleContexts, TypeFamilies #-}
module Propellor.Property.Versioned (Versioned, version, (-->), (<|>)) where
import Propellor
import Propellor.Types.Core
import Data.List
type Versioned v t = VersionedBy v -> t
type VersionedBy v
= forall metatypes. Combines (RevertableProperty metatypes metatypes) (RevertableProperty metatypes metatypes)
=> (CombinedType (RevertableProperty metatypes metatypes) (RevertableProperty metatypes metatypes) ~ RevertableProperty metatypes metatypes)
=> (VerSpec v metatypes -> RevertableProperty metatypes metatypes)
version :: (Versioned v t) -> v -> t
version :: forall v t. Versioned v t -> v -> t
version Versioned v t
f v
v = Versioned v t
f (forall metatypes v.
(Combines
(RevertableProperty metatypes metatypes)
(RevertableProperty metatypes metatypes),
CombinedType
(RevertableProperty metatypes metatypes)
(RevertableProperty metatypes metatypes)
~ RevertableProperty metatypes metatypes) =>
v -> VerSpec v metatypes -> RevertableProperty metatypes metatypes
processVerSpec v
v)
data VerSpec v metatypes
= Base (v -> Bool, RevertableProperty metatypes metatypes)
| More (v -> Bool, RevertableProperty metatypes metatypes) (VerSpec v metatypes)
processVerSpec
:: Combines (RevertableProperty metatypes metatypes) (RevertableProperty metatypes metatypes)
=> (CombinedType (RevertableProperty metatypes metatypes) (RevertableProperty metatypes metatypes) ~ RevertableProperty metatypes metatypes)
=> v
-> VerSpec v metatypes
-> RevertableProperty metatypes metatypes
processVerSpec :: forall metatypes v.
(Combines
(RevertableProperty metatypes metatypes)
(RevertableProperty metatypes metatypes),
CombinedType
(RevertableProperty metatypes metatypes)
(RevertableProperty metatypes metatypes)
~ RevertableProperty metatypes metatypes) =>
v -> VerSpec v metatypes -> RevertableProperty metatypes metatypes
processVerSpec v
v VerSpec v metatypes
s = VerSpec v metatypes -> RevertableProperty metatypes metatypes
combinedp VerSpec v metatypes
s
forall p. IsProp p => p -> Desc -> p
`describe` forall a. [a] -> [[a]] -> [a]
intercalate Desc
" and " (VerSpec v metatypes -> [Desc] -> [Desc]
combineddesc VerSpec v metatypes
s [])
where
combinedp :: VerSpec v metatypes -> RevertableProperty metatypes metatypes
combinedp (Base (v -> Bool
c, RevertableProperty metatypes metatypes
p))
| v -> Bool
c v
v = RevertableProperty metatypes metatypes
p
| Bool
otherwise = forall setup undo.
RevertableProperty setup undo -> RevertableProperty undo setup
revert RevertableProperty metatypes metatypes
p
combinedp (More (v -> Bool
c, RevertableProperty metatypes metatypes
p) VerSpec v metatypes
vs)
| v -> Bool
c v
v = VerSpec v metatypes -> RevertableProperty metatypes metatypes
combinedp VerSpec v metatypes
vs forall x y. Combines x y => x -> y -> CombinedType x y
`before` RevertableProperty metatypes metatypes
p
| Bool
otherwise = forall setup undo.
RevertableProperty setup undo -> RevertableProperty undo setup
revert RevertableProperty metatypes metatypes
p forall x y. Combines x y => x -> y -> CombinedType x y
`before` VerSpec v metatypes -> RevertableProperty metatypes metatypes
combinedp VerSpec v metatypes
vs
combineddesc :: VerSpec v metatypes -> [Desc] -> [Desc]
combineddesc (Base (v -> Bool
c, RevertableProperty metatypes metatypes
p)) [Desc]
l
| v -> Bool
c v
v = forall p. IsProp p => p -> Desc
getDesc RevertableProperty metatypes metatypes
p forall a. a -> [a] -> [a]
: [Desc]
l
| Bool
otherwise = forall p. IsProp p => p -> Desc
getDesc (forall setup undo.
RevertableProperty setup undo -> RevertableProperty undo setup
revert RevertableProperty metatypes metatypes
p) forall a. a -> [a] -> [a]
: [Desc]
l
combineddesc (More (v -> Bool
c, RevertableProperty metatypes metatypes
p) VerSpec v metatypes
vs) [Desc]
l
| v -> Bool
c v
v = forall p. IsProp p => p -> Desc
getDesc RevertableProperty metatypes metatypes
p forall a. a -> [a] -> [a]
: VerSpec v metatypes -> [Desc] -> [Desc]
combineddesc VerSpec v metatypes
vs [Desc]
l
| Bool
otherwise = forall p. IsProp p => p -> Desc
getDesc (forall setup undo.
RevertableProperty setup undo -> RevertableProperty undo setup
revert RevertableProperty metatypes metatypes
p) forall a. a -> [a] -> [a]
: VerSpec v metatypes -> [Desc] -> [Desc]
combineddesc VerSpec v metatypes
vs [Desc]
l
(-->) :: (v -> Bool) -> RevertableProperty metatypes metatypes -> VerSpec v metatypes
v -> Bool
c --> :: forall v metatypes.
(v -> Bool)
-> RevertableProperty metatypes metatypes -> VerSpec v metatypes
--> RevertableProperty metatypes metatypes
p = forall v metatypes.
(v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes
Base (v -> Bool
c, RevertableProperty metatypes metatypes
p)
(<|>) :: VerSpec v metatypes -> VerSpec v metatypes -> VerSpec v metatypes
Base (v -> Bool, RevertableProperty metatypes metatypes)
a <|> :: forall v metatypes.
VerSpec v metatypes -> VerSpec v metatypes -> VerSpec v metatypes
<|> Base (v -> Bool, RevertableProperty metatypes metatypes)
b = forall v metatypes.
(v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes -> VerSpec v metatypes
More (v -> Bool, RevertableProperty metatypes metatypes)
a (forall v metatypes.
(v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes
Base (v -> Bool, RevertableProperty metatypes metatypes)
b)
Base (v -> Bool, RevertableProperty metatypes metatypes)
a <|> More (v -> Bool, RevertableProperty metatypes metatypes)
b VerSpec v metatypes
c = forall v metatypes.
(v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes -> VerSpec v metatypes
More (v -> Bool, RevertableProperty metatypes metatypes)
a (forall v metatypes.
(v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes -> VerSpec v metatypes
More (v -> Bool, RevertableProperty metatypes metatypes)
b VerSpec v metatypes
c)
More (v -> Bool, RevertableProperty metatypes metatypes)
b VerSpec v metatypes
c <|> Base (v -> Bool, RevertableProperty metatypes metatypes)
a = forall v metatypes.
(v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes -> VerSpec v metatypes
More (v -> Bool, RevertableProperty metatypes metatypes)
a (forall v metatypes.
(v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes -> VerSpec v metatypes
More (v -> Bool, RevertableProperty metatypes metatypes)
b VerSpec v metatypes
c)
More (v -> Bool, RevertableProperty metatypes metatypes)
a VerSpec v metatypes
b <|> More (v -> Bool, RevertableProperty metatypes metatypes)
c VerSpec v metatypes
d = forall v metatypes.
(v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes -> VerSpec v metatypes
More (v -> Bool, RevertableProperty metatypes metatypes)
a (forall v metatypes.
(v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes -> VerSpec v metatypes
More (v -> Bool, RevertableProperty metatypes metatypes)
c (VerSpec v metatypes
b forall v metatypes.
VerSpec v metatypes -> VerSpec v metatypes -> VerSpec v metatypes
<|> VerSpec v metatypes
d))
infixl 8 -->
infixl 2 <|>