Portability | portable |
---|---|
Stability | unstable, may self-destruct |
Maintainer | Mark Lentczner <mzero@glyphic.com> |
Safe Haskell | Safe-Infered |
Construction and operation of evil inventions in the Tri-State area. Based on the pioneering work of Dr. Heinz Doofenschmirtz.
- type EvilInvention a b = (TrappedAgent, a) -> b
- inator :: (TrappedAgent, a) -> a
- selfDestruct :: EvilInvention a b -> TriStateArea ()
- data Agent = Agent Char
- perryThePlatypus :: Agent
- data TrappedAgent
- data TriStateArea a
- activate :: EvilInvention a b -> TriStateArea (a -> TriStateArea b)
- whileTrapping :: Agent -> TriStateArea a -> Maybe a
Evil Inventions
type EvilInvention a b = (TrappedAgent, a) -> bSource
An EvilInvention
is like a normal function a -> b
, only used in evil
plans. It will only function in the context of a TrappedAgent
. See
activate
for how to turn one one.
inator :: (TrappedAgent, a) -> aSource
Combinator to turn a function into an EvilInvention
. Typically applied
via the .
operator, like so:
incrementinator :: EvilInvention Int Int incrementinator = (+1) . inator
selfDestruct :: EvilInvention a b -> TriStateArea ()Source
Warning: All EvilInvention
s have a selfDestruct
ability. When an
EvilInvention
self-destructs, all effects of evil plans in the
TriStateArea
are nullified, as if Nothing
ever happened.
Secret Agents
Agents are secret, and distinguished only by their letter designations.
perryThePlatypus :: AgentSource
Agent
'P'
data TrappedAgent Source
When trapped, an Agent
enables an EvilInvention
to be activate
d and
then used. The scope of trapping an Agent
is strictly delimited.
See whileTrapping
.
The TriStateArea
data TriStateArea a Source
Activation and operation of an EvilInvention
is strictly limited to the
TriStateArea
. Plans executed in the TriStateArea
may fail
, causing the
whole plan to have no externally visible effect.
activate :: EvilInvention a b -> TriStateArea (a -> TriStateArea b)Source
EvilInvention
s must be activated before use. The activated machine can
then be applied to suitable targets of scorn and dislike. N.B.: Activation
and subsequent operation of an EvilInvention
can only be performed in the
TriStateArea
.
evilPlan :: TriStateArea Int evilPlan = do zap <- activate incrementinator as <- mapM zap [1..37] b <- zap 38 -- I never really liked the number 38 selfDestruct incrementinator cs <- mapM zap [39..100] return $ sum as + b + sum cs
whileTrapping :: Agent -> TriStateArea a -> Maybe aSource
To execute any plan (evil or otherwise
) in the TriStateArea
, an
Agent
must be trapped with this function, and held for the duration of
of the plan.
executeEvilPlan = whileTrapping perryThePlatypus evilPlan main :: IO () main = do putStrLn $ case executeEvilPlan of Nothing -> "Curse you, Perry the Platypus!" Just a -> "Ha ha! I have incremented the TriStateArea to " ++ show a