Created
July 10, 2019 03:56
-
-
Save alunduil/d85c0e9e0e93162642b8055c7fe5f1af to your computer and use it in GitHub Desktop.
/tmp/Override.hs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Override where | |
import Control.Arrow ((&&&), (|||)) | |
newtype Selector a = Selector { unSelector :: a -> Bool } | |
class Or a where | |
or :: a -> a -> a | |
class And a where | |
and :: a -> a -> a | |
instance Or (Selector a) where | |
(Selector a) `or` (Selector b) = Selector ((a ||| b) . Right) | |
instance And (Selector a) where | |
(Selector a) `and` (Selector b) = Selector (uncurry (||) . (a &&& b)) | |
newtype Mutator a = Mutator { unMutator :: a -> a } | |
instance Semigroup (Mutator a) where | |
(Mutator a) <> (Mutator b) = Mutator (b . a) | |
data Override a = Override { selector :: Selector a, mutator :: Mutator a} | |
any :: Selector a | |
any = Selector $ const True | |
overrides :: [Override Int] | |
overrides = [ Override { selector = Override.any | |
, mutator = Mutator id | |
} | |
, Override { selector = Selector even | |
, mutator = Mutator (+1) | |
} | |
, Override { selector = Selector ((== 0) . (`div` 3)) `Override.and` Selector ((== 0) . (`div` 5)) | |
, mutator = Mutator (+1000) | |
} | |
] | |
override :: Override a -> a -> a | |
override Override { selector = Selector s, mutator = Mutator m } x | s x = m x | |
| otherwise = x | |
main :: IO () | |
main = do | |
print $ foldr override 0 overrides | |
print $ foldr override 2 overrides | |
print $ foldr override 15 overrides |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment