Shpadoinkle-widgets-0.0.0.1: Shpadoinkle/Widgets/Types/Physical.hs
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE LambdaCase #-}
module Shpadoinkle.Widgets.Types.Physical where
import Data.Aeson
import GHC.Generics
import Shpadoinkle.Widgets.Types.Core
data Toggle = Closed Hygiene | Open
deriving (Eq, Ord, Show, Read, Generic, ToJSON, FromJSON)
togHygiene :: Toggle -> Hygiene
togHygiene = \case
Closed x -> x
_ -> Dirty
instance Enum Toggle where
fromEnum (Closed Clean) = 0
fromEnum Open = 1
fromEnum (Closed Dirty) = 2
toEnum 0 = Closed Clean
toEnum 1 = Open
toEnum 2 = Closed Dirty
toEnum _ = error "Not a valid Toggle"
instance Bounded Toggle where
minBound = Closed Clean
maxBound = Closed Dirty
instance Semigroup Toggle where
Closed x <> Closed y = Closed (x <> y)
Closed Clean <> x = x
x <> Closed Clean = x
Closed Dirty <> _ = Closed Dirty
_ <> Closed Dirty = Closed Dirty
_ <> _ = Open
instance Monoid Toggle where
mempty = Closed Clean
class IsToggle a where
close :: a -> a
toggle :: a -> a
open :: a -> a
instance IsToggle Toggle where
close = \case
Open -> Closed Dirty
t -> t
toggle = \case
Open -> Closed Dirty
Closed _ -> Open
open = const Open
data Visbility = Visible | Hidden
deriving (Eq, Ord, Show, Enum, Bounded, Generic)