Util.hs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. {-- Util.hs - basic util functions which probably belong elsewhere
  2. -- Copyright (C) 2018 caryoscelus
  3. --
  4. -- This program is free software: you can redistribute it and/or modify
  5. -- it under the terms of the GNU General Public License as published by
  6. -- the Free Software Foundation, either version 3 of the License, or
  7. -- (at your option) any later version.
  8. --
  9. -- This program is distributed in the hope that it will be useful,
  10. -- but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. -- GNU General Public License for more details.
  13. --
  14. -- You should have received a copy of the GNU General Public License
  15. -- along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. --}
  17. {-# LANGUAGE
  18. NoMonomorphismRestriction,
  19. ScopedTypeVariables,
  20. TypeFamilies,
  21. LambdaCase,
  22. GADTs,
  23. FlexibleContexts
  24. #-}
  25. module Util where
  26. foreverTil :: Monad m => m Bool -> m a -> m a
  27. foreverTil cond m = do
  28. r <- m
  29. e <- cond
  30. if not e then
  31. foreverTil cond m
  32. else
  33. pure r
  34. modifyAt :: Int -> (a -> a) -> [a] -> [a]
  35. modifyAt n f l = take n l <> [f (l !! n)] <> drop (n + 1) l
  36. when' :: Bool -> (a -> a) -> (a -> a)
  37. when' c f = if c then f else id