Skip to content

Instantly share code, notes, and snippets.

@alunduil
Created July 10, 2019 03:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alunduil/d85c0e9e0e93162642b8055c7fe5f1af to your computer and use it in GitHub Desktop.
Save alunduil/d85c0e9e0e93162642b8055c7fe5f1af to your computer and use it in GitHub Desktop.
/tmp/Override.hs
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