{-# LANGUAGE CPP #-}
module Boots.Prelude(
    rightToMaybe
  , whenJust
  , mapLeft
  , when
  , unless
  , IsString(..)
  , view
  , over
  , Lens'
  , lens
  , (&)
  , Monoid(..)
  , Proxy(..)
  , Default(..)
  ) where

import           Control.Monad
import           Data.Default
import           Data.Proxy
import           Data.String
import           Lens.Micro
import           Lens.Micro.Extras
#if __GLASGOW_HASKELL__ < 804
import           Data.Semigroup    ()
#endif

rightToMaybe :: Either a b -> Maybe b
rightToMaybe (Left  _) = Nothing
rightToMaybe (Right b) = Just b

whenJust :: Applicative f => Maybe a -> (a -> f ()) -> f ()
whenJust (Just a) f = f a
whenJust _        _ = pure ()

mapLeft :: (a -> c) -> Either a b -> Either c b
mapLeft _ (Right a) = Right a
mapLeft f (Left  a) = Left (f a)