+ where ones = M.keys $ M.filter (== Zero) mask
+
+
+executeInstructions2 instructions =
+ foldl' executeInstruction2 emtpyMachine instructions
+
+executeInstruction2 machine (Mask mask) = machine {mMask = mask}
+executeInstruction2 machine (Assignment loc value) = machine {mMemory = mem'}
+ where locs = map encodeMask $ applyAddressMask (mMask machine) $ decodeMask loc
+ mem = mMemory machine
+ mem' = foldl' (\m l -> M.insert l value m) mem locs
+
+
+encodeMask :: MaskMap -> Int64
+encodeMask mask = M.foldrWithKey' setBitValue zeroBits mask
+ where setBitValue _ Zero n = n
+ setBitValue i One n = setBit n i
+
+decodeMask :: Int64 -> MaskMap
+decodeMask val = M.fromList [ (i, decodeBit $ testBit val i)
+ | i <- [0..(finiteBitSize val)]
+ ]
+ where decodeBit True = One
+ decodeBit False = Zero
+
+applyAddressMask :: MaskMap -> MaskMap -> [MaskMap]
+applyAddressMask mask address = M.foldrWithKey' applyBit [address] mask