content: {-# LANGUAGE DeriveFunctor #-}
  {-# LANGUAGE ViewPatterns #-}
  {-# LANGUAGE PatternSynonyms #-}
  {-# LANGUAGE ScopedTypeVariables #-}
  
  -- From https://ocharles.org.uk/blog/posts/2014-12-03-pattern-synonyms.html
  
  import Foreign.C
  
  {-
  
  data BlendMode = NoBlending -- | AlphaBlending | AdditiveBlending | ColourModulatedBlending
  
  toBlendMode :: BlendMode -> CInt
  toBlendMode NoBlending = 0 -- #{const SDL_BLENDMODE_NONE}
  -- toBlendMode AlphaBlending = #{const SDL_BLENDMODE_BLEND}
  
  fromBlendMode :: CInt -> Maybe BlendMode
  fromBlendMode 0 = Just NoBlending
  
  -}
  
  {-
  
  pattern AlphaBlending = (1) :: CInt -- #{const SDL_BLENDMODE_BLEND} :: CInt
  
  setUpBlendMode :: CInt -> IO ()
  setUpBlendMode AlphaBlending = do
    putStrLn "Enabling Alpha Blending"
    activateAlphaBlendingForAllTextures
    activateRenderAlphaBlending
  
  -}
  
  newtype BlendMode = MkBlendMode { unBlendMode :: CInt }
  
  pattern NoBlending = MkBlendMode 0 -- #{const SDL_BLENDMODE_NONE}
  pattern AlphaBlending = MkBlendMode 1 -- #{const SDL_BLENDMODE_BLEND}
  
  setUpBlendMode :: BlendMode -> IO ()
  setUpBlendMode AlphaBlending = do
    putStrLn "Enabling Alpha Blending"
    activateAlphaBlendingForAllTextures
    activateRenderAlphaBlending
  
  data Renderer
  
  setRenderAlphaBlending :: Renderer -> IO ()
  setRenderAlphaBlending r =
    sdlSetRenderDrawBlendMode r (unBlendMode AlphaBlending)
  
  activateAlphaBlendingForAllTextures = return ()
  activateRenderAlphaBlending = return ()
  
  sdlSetRenderDrawBlendMode _ _ = return ()
  
  -- And from https://www.fpcomplete.com/user/icelandj/Pattern%20synonyms
  
  data Date = Date { month :: Int, day :: Int } deriving Show
  
  -- Months
  pattern January  day = Date { month = 1,  day = day }
  pattern February day = Date { month = 2,  day = day }
  pattern March    day = Date { month = 3,  day = day }
  -- elided
  pattern December day = Date { month = 12, day = day }
  
  -- Holidays
  pattern Christmas    = Date { month = 12, day = 25  }
  
  describe :: Date -> String
  describe (January 1)  = "First day of year"
  describe (February n) = show n ++ "th of February"
  describe Christmas    = "Presents!"
  describe _            = "meh"
  
  pattern Christmas2 = December 25
  
  pattern BeforeChristmas <- December (compare 25 -> GT)
  pattern Christmas3      <- December (compare 25 -> EQ)
  pattern AfterChristmas  <- December (compare 25 -> LT)
  
  react :: Date -> String
  react BeforeChristmas = "Waiting :("
  react Christmas       = "Presents!"
  react AfterChristmas  = "Have to wait a whole year :("
  react _               = "It's not even December..."
  
  isItNow :: Int -> (Ordering, Int)
  isItNow day = (compare 25 day, day)
  
  pattern BeforeChristmas4 day <- December (isItNow -> (GT, day))
  pattern Christmas4           <- December (isItNow -> (EQ, _))
  pattern AfterChristmas4  day <- December (isItNow -> (LT, day))
  
  days'tilChristmas :: Date -> Int
  days'tilChristmas (BeforeChristmas4 n) = 25 - n
  days'tilChristmas Christmas4           = 0
  days'tilChristmas (AfterChristmas4 n)  = 365 + 25 - n
  