+updateWaterChunk x y valid sim = updateScaffolder x y valid sim
+ ((0,1) : (waterRandom [(-1,1),(1,1),(-1,0),(1,0)] x y))
+ (\qd ->
+ elem qd valid &&
+ fromEnum (simGetChunkType sim ((+) x $ fst qd) ((+) y $ snd qd)) == fromEnum Air
+ )
+ (\qd -> simSet
+ (simSet sim ChunkData { chunkType=Air } x y)
+ ChunkData { chunkType=Water }
+ ((+) x $ fst qd)
+ ((+) y $ snd qd)
+ )
+
+-- really stupid pure psuedorandom
+waterRandom d x y =
+ let perm = L.permutations d
+ in perm !! ((x^y+x*y^x+x) `mod` (length perm))
+
+updatePumpChunk x y valid sim = updateScaffolder x y valid sim
+ [(0,1),(-1,0),(1,0)]
+ (\qd ->
+ elem qd valid &&
+ fromEnum (simGetChunkType sim ((+) x $ fst qd) ((+) y $ snd qd)) == fromEnum Air
+ )
+ (\qd -> simSet sim ChunkData { chunkType=Water } ((+) x $ fst qd) ((+) y $ snd qd))
+
+updateDrainChunk x y valid sim = updateScaffolder x y valid sim
+ [(0,1),(0,-1),(-1,0),(1,0)]
+ (\qd ->
+ elem qd valid &&
+ fromEnum (simGetChunkType sim ((+) x $ fst qd) ((+) y $ snd qd)) == fromEnum Water
+ )
+ (\qd -> simSet sim ChunkData { chunkType=Air } ((+) x $ fst qd) ((+) y $ snd qd))
+