{-# 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 :: Versioned v t -> v -> t
version Versioned v t
f v
v = Versioned v t
f (v -> VerSpec v metatypes -> RevertableProperty metatypes metatypes
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 :: 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
RevertableProperty metatypes metatypes
-> Desc -> RevertableProperty metatypes metatypes
forall p. IsProp p => p -> Desc -> p
`describe` Desc -> [Desc] -> Desc
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 = RevertableProperty metatypes metatypes
-> RevertableProperty metatypes metatypes
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 RevertableProperty metatypes metatypes
-> RevertableProperty metatypes metatypes
-> CombinedType
(RevertableProperty metatypes metatypes)
(RevertableProperty metatypes metatypes)
forall x y. Combines x y => x -> y -> CombinedType x y
`before` RevertableProperty metatypes metatypes
p
| Bool
otherwise = RevertableProperty metatypes metatypes
-> RevertableProperty metatypes metatypes
forall setup undo.
RevertableProperty setup undo -> RevertableProperty undo setup
revert RevertableProperty metatypes metatypes
p RevertableProperty metatypes metatypes
-> RevertableProperty metatypes metatypes
-> CombinedType
(RevertableProperty metatypes metatypes)
(RevertableProperty metatypes metatypes)
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 = RevertableProperty metatypes metatypes -> Desc
forall p. IsProp p => p -> Desc
getDesc RevertableProperty metatypes metatypes
p Desc -> [Desc] -> [Desc]
forall a. a -> [a] -> [a]
: [Desc]
l
| Bool
otherwise = RevertableProperty metatypes metatypes -> Desc
forall p. IsProp p => p -> Desc
getDesc (RevertableProperty metatypes metatypes
-> RevertableProperty metatypes metatypes
forall setup undo.
RevertableProperty setup undo -> RevertableProperty undo setup
revert RevertableProperty metatypes metatypes
p) Desc -> [Desc] -> [Desc]
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 = RevertableProperty metatypes metatypes -> Desc
forall p. IsProp p => p -> Desc
getDesc RevertableProperty metatypes metatypes
p Desc -> [Desc] -> [Desc]
forall a. a -> [a] -> [a]
: VerSpec v metatypes -> [Desc] -> [Desc]
combineddesc VerSpec v metatypes
vs [Desc]
l
| Bool
otherwise = RevertableProperty metatypes metatypes -> Desc
forall p. IsProp p => p -> Desc
getDesc (RevertableProperty metatypes metatypes
-> RevertableProperty metatypes metatypes
forall setup undo.
RevertableProperty setup undo -> RevertableProperty undo setup
revert RevertableProperty metatypes metatypes
p) Desc -> [Desc] -> [Desc]
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 --> :: (v -> Bool)
-> RevertableProperty metatypes metatypes -> VerSpec v metatypes
--> RevertableProperty metatypes metatypes
p = (v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes
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 <|> :: VerSpec v metatypes -> VerSpec v metatypes -> VerSpec v metatypes
<|> Base (v -> Bool, RevertableProperty metatypes metatypes)
b = (v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes -> VerSpec v metatypes
forall v metatypes.
(v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes -> VerSpec v metatypes
More (v -> Bool, RevertableProperty metatypes metatypes)
a ((v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes
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 = (v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes -> VerSpec v metatypes
forall v metatypes.
(v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes -> VerSpec v metatypes
More (v -> Bool, RevertableProperty metatypes metatypes)
a ((v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes -> VerSpec v metatypes
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 = (v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes -> VerSpec v metatypes
forall v metatypes.
(v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes -> VerSpec v metatypes
More (v -> Bool, RevertableProperty metatypes metatypes)
a ((v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes -> VerSpec v metatypes
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 = (v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes -> VerSpec v metatypes
forall v metatypes.
(v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes -> VerSpec v metatypes
More (v -> Bool, RevertableProperty metatypes metatypes)
a ((v -> Bool, RevertableProperty metatypes metatypes)
-> VerSpec v metatypes -> VerSpec v metatypes
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 VerSpec v metatypes -> VerSpec v metatypes -> VerSpec v metatypes
forall v metatypes.
VerSpec v metatypes -> VerSpec v metatypes -> VerSpec v metatypes
<|> VerSpec v metatypes
d))
infixl 8 -->
infixl 2 <|>