{-
Laws:
* zero .?. _ = False
* (fs .+. f) .?. f = True
* (fs .-. f) .?. f = False
* flag _ /= zero
-}
class FlagCarrier c where
(.+.) :: (Enum f
) => c f
-> f
-> c f
(.-.) :: (Enum f
) => c f
-> f
-> c f
flag
:: (Enum f
) => f
-> c f
instance FlagCarrier BitCarrier where
(M m) .?. f = testBit m (repr f)
(M m) .+. f = M $ setBit m (repr f)
(M m) .-. f = M $ clearBit m (repr f)
flag f = M $ bit (repr f)
zero = M 0
ey0KTGF3czoKICAgICogemVybyAuPy4gXyAgICAgICAgPSBGYWxzZQogICAgKiAoZnMgLisuIGYpIC4/LiBmICA9IFRydWUKICAgICogKGZzIC4tLiBmKSAuPy4gZiAgPSBGYWxzZQogICAgKiBmbGFnIF8gICAgICAgICAgIC89IHplcm8KLX0KY2xhc3MgRmxhZ0NhcnJpZXIgYyB3aGVyZQogICAgKC4/LikgOjogKEVudW0gZikgPT4gYyBmIC0+IGYgLT4gQm9vbAogICAgKC4rLikgOjogKEVudW0gZikgPT4gYyBmIC0+IGYgLT4gYyBmCiAgICAoLi0uKSA6OiAoRW51bSBmKSA9PiBjIGYgLT4gZiAtPiBjIGYKICAgIGZsYWcgIDo6IChFbnVtIGYpID0+IGYgLT4gYyBmCiAgICB6ZXJvICA6OiAoRW51bSBmKSA9PiBjIGYKCmluc3RhbmNlIEZsYWdDYXJyaWVyIEJpdENhcnJpZXIgd2hlcmUKICAgIChNIG0pIC4/LiBmID0gdGVzdEJpdCBtIChyZXByIGYpCiAgICAoTSBtKSAuKy4gZiA9IE0gJCBzZXRCaXQgbSAocmVwciBmKQogICAgKE0gbSkgLi0uIGYgPSBNICQgY2xlYXJCaXQgbSAocmVwciBmKQogICAgZmxhZyAgICAgIGYgPSBNICQgYml0IChyZXByIGYpCiAgICB6ZXJvICAgICAgICA9IE0gMAo=