{-# LANGUAGE RankNTypes #-}

module Util where

import Control.Monad.State

import Data.Char
import Data.List

import Lens.Micro
import Lens.Micro.Extras

use :: MonadState s m => Lens s s a a -> m a
use :: forall s (m :: * -> *) a. MonadState s m => Lens s s a a -> m a
use Lens s s a a
l = (s -> a) -> m a
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets ((s -> a) -> m a) -> (s -> a) -> m a
forall a b. (a -> b) -> a -> b
$ Getting a s a -> s -> a
forall a s. Getting a s a -> s -> a
view Getting a s a
Lens s s a a
l
  -- eta-expanded for GHC-9.0

modifying :: MonadState s m => Lens s s a a -> (a -> a) -> m ()
modifying :: forall s (m :: * -> *) a.
MonadState s m =>
Lens s s a a -> (a -> a) -> m ()
modifying Lens s s a a
l = (s -> s) -> m ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((s -> s) -> m ()) -> ((a -> a) -> s -> s) -> (a -> a) -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ASetter s s a a -> (a -> a) -> s -> s
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over ASetter s s a a
Lens s s a a
l

trim :: String -> String
trim :: String -> String
trim = (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
dropWhileEnd Char -> Bool
isSpace (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
dropWhile Char -> Bool
isSpace