Hello community, here is the log from the commit of package ghc-safe for openSUSE:Leap:15.2 checked in at 2020-02-19 18:41:02 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Leap:15.2/ghc-safe (Old) and /work/SRC/openSUSE:Leap:15.2/.ghc-safe.new.26092 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-safe" Wed Feb 19 18:41:02 2020 rev:13 rq:771441 version:0.3.18 Changes: -------- --- /work/SRC/openSUSE:Leap:15.2/ghc-safe/ghc-safe.changes 2020-01-15 15:02:35.801815470 +0100 +++ /work/SRC/openSUSE:Leap:15.2/.ghc-safe.new.26092/ghc-safe.changes 2020-02-19 18:41:03.146178631 +0100 @@ -1,0 +2,14 @@ +Thu Dec 5 03:02:47 UTC 2019 - [email protected] + +- Update safe to version 0.3.18. + 0.3.18, released 2019-12-04 + #27, deprecate maximumDef and friends, fold*1Def + #27, add maximumBounded and friends + Stop supporting GHC 7.4 to 7.8 + +------------------------------------------------------------------- +Fri Nov 8 16:14:39 UTC 2019 - Peter Simons <[email protected]> + +- Drop obsolete group attributes. + +------------------------------------------------------------------- Old: ---- safe-0.3.17.tar.gz New: ---- safe-0.3.18.tar.gz safe.cabal ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ghc-safe.spec ++++++ --- /var/tmp/diff_new_pack.YNPbY1/_old 2020-02-19 18:41:03.470179029 +0100 +++ /var/tmp/diff_new_pack.YNPbY1/_new 2020-02-19 18:41:03.474179033 +0100 @@ -1,7 +1,7 @@ # # spec file for package ghc-safe # -# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,13 +19,13 @@ %global pkg_name safe %bcond_with tests Name: ghc-%{pkg_name} -Version: 0.3.17 +Version: 0.3.18 Release: 0 Summary: Library of safe (exception free) functions License: BSD-3-Clause -Group: Development/Libraries/Haskell URL: https://hackage.haskell.org/package/%{pkg_name} Source0: https://hackage.haskell.org/package/%{pkg_name}-%{version}/%{pkg_name}-%{version}.tar.gz +Source1: https://hackage.haskell.org/package/%{pkg_name}-%{version}/revision/1.cabal#/%{pkg_name}.cabal BuildRequires: ghc-Cabal-devel BuildRequires: ghc-rpm-macros %if %{with tests} @@ -62,7 +62,6 @@ %package devel Summary: Haskell %{pkg_name} library development files -Group: Development/Libraries/Haskell Requires: %{name} = %{version}-%{release} Requires: ghc-compiler = %{ghc_version} Requires(post): ghc-compiler = %{ghc_version} @@ -73,6 +72,7 @@ %prep %setup -q -n %{pkg_name}-%{version} +cp -p %{SOURCE1} %{pkg_name}.cabal %build %ghc_lib_build ++++++ safe-0.3.17.tar.gz -> safe-0.3.18.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/safe-0.3.17/CHANGES.txt new/safe-0.3.18/CHANGES.txt --- old/safe-0.3.17/CHANGES.txt 2018-03-09 18:20:17.000000000 +0100 +++ new/safe-0.3.18/CHANGES.txt 2019-12-04 11:32:53.000000000 +0100 @@ -1,5 +1,9 @@ Changelog for Safe +0.3.18, released 2019-12-04 + #27, deprecate maximumDef and friends, fold*1Def + #27, add maximumBounded and friends + Stop supporting GHC 7.4 to 7.8 0.3.17, released 2018-03-09 Improve the display of errors, less internal callstack Add a few missing Partial constraints diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/safe-0.3.17/LICENSE new/safe-0.3.18/LICENSE --- old/safe-0.3.17/LICENSE 2018-03-09 18:20:17.000000000 +0100 +++ new/safe-0.3.18/LICENSE 2019-02-26 11:59:42.000000000 +0100 @@ -1,4 +1,4 @@ -Copyright Neil Mitchell 2007-2018. +Copyright Neil Mitchell 2007-2019. All rights reserved. Redistribution and use in source and binary forms, with or without diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/safe-0.3.17/README.md new/safe-0.3.18/README.md --- old/safe-0.3.17/README.md 2018-03-09 18:20:17.000000000 +0100 +++ new/safe-0.3.18/README.md 2019-05-26 13:36:03.000000000 +0200 @@ -1,4 +1,4 @@ -# Safe [](https://hackage.haskell.org/package/safe) [](https://travis-ci.org/ndmitchell/safe) +# Safe [](https://hackage.haskell.org/package/safe) [](https://www.stackage.org/package/safe) [](https://travis-ci.org/ndmitchell/safe) A library wrapping `Prelude`/`Data.List` functions that can throw exceptions, such as `head` and `!!`. Each unsafe function has up to four variants, e.g. with `tail`: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/safe-0.3.17/Safe/Exact.hs new/safe-0.3.18/Safe/Exact.hs --- old/safe-0.3.17/Safe/Exact.hs 2018-03-09 18:20:17.000000000 +0100 +++ new/safe-0.3.18/Safe/Exact.hs 2018-06-08 22:14:03.000000000 +0200 @@ -1,5 +1,6 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE ConstraintKinds #-} +{-# LANGUAGE TupleSections #-} {- | Provides functions that raise errors in corner cases instead of returning \"best effort\" results, then provides wrappers like the "Safe" module. For example: @@ -103,7 +104,7 @@ -- > | otherwise = error "some message" splitAtExact :: Partial => Int -> [a] -> ([a], [a]) splitAtExact i xs = withFrozenCallStack $ splitAtExact_ (addNote "" "splitAtExact") - (\x -> ([], x)) (\a b -> first (a:) b) i xs + ([],) (\a b -> first (a:) b) i xs takeExactNote :: Partial => String -> Int -> [a] -> [a] takeExactNote note i xs = withFrozenCallStack $ splitAtExact_ (addNote note "takeExactNote") (const []) (:) i xs @@ -125,7 +126,7 @@ splitAtExactNote :: Partial => String -> Int -> [a] -> ([a], [a]) splitAtExactNote note i xs = withFrozenCallStack $ splitAtExact_ (addNote note "splitAtExactNote") - (\x -> ([], x)) (\a b -> first (a:) b) i xs + ([],) (\a b -> first (a:) b) i xs splitAtExactMay :: Int -> [a] -> Maybe ([a], [a]) splitAtExactMay = splitAtExact_ (const Nothing) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/safe-0.3.17/Safe/Foldable.hs new/safe-0.3.18/Safe/Foldable.hs --- old/safe-0.3.17/Safe/Foldable.hs 2018-03-09 18:20:17.000000000 +0100 +++ new/safe-0.3.18/Safe/Foldable.hs 2019-12-04 11:32:22.000000000 +0100 @@ -1,5 +1,4 @@ {-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE CPP #-} {-# LANGUAGE ConstraintKinds #-} {- | 'Foldable' functions, with wrappers like the "Safe" module. @@ -11,12 +10,16 @@ foldl1May, foldl1Def, foldl1Note, foldr1May, foldr1Def, foldr1Note, findJustDef, findJustNote, - minimumMay, minimumDef, minimumNote, - maximumMay, maximumDef, maximumNote, - minimumByMay, minimumByDef, minimumByNote, - maximumByMay, maximumByDef, maximumByNote, + minimumMay, minimumNote, + maximumMay, maximumNote, + minimumByMay, minimumByNote, + maximumByMay, maximumByNote, + maximumBoundBy, minimumBoundBy, + maximumBounded, maximumBound, + minimumBounded, minimumBound, -- * Deprecated - foldl1Safe, foldr1Safe, findJustSafe + foldl1Safe, foldr1Safe, findJustSafe, + minimumDef, maximumDef, minimumByDef, maximumByDef ) where import Safe.Util @@ -33,52 +36,64 @@ fromNote :: Partial => String -> String -> Maybe a -> a fromNote = fromNoteModule "Safe.Foldable" -isNull :: Foldable t => t a -> Bool -#if __GLASGOW_HASKELL__ < 710 -isNull = null . toList -#else -isNull = F.null -#endif --------------------------------------------------------------------- -- WRAPPERS foldl1May, foldr1May :: Foldable t => (a -> a -> a) -> t a -> Maybe a -foldl1May = liftMay isNull . F.foldl1 -foldr1May = liftMay isNull . F.foldr1 +foldl1May = liftMay F.null . F.foldl1 +foldr1May = liftMay F.null . F.foldr1 foldl1Note, foldr1Note :: (Partial, Foldable t) => String -> (a -> a -> a) -> t a -> a foldl1Note note f x = withFrozenCallStack $ fromNote note "foldl1Note on empty" $ foldl1May f x foldr1Note note f x = withFrozenCallStack $ fromNote note "foldr1Note on empty" $ foldr1May f x -foldl1Def, foldr1Def :: Foldable t => a -> (a -> a -> a) -> t a -> a -foldl1Def def = fromMaybe def .^ foldl1May -foldr1Def def = fromMaybe def .^ foldr1May - minimumMay, maximumMay :: (Foldable t, Ord a) => t a -> Maybe a -minimumMay = liftMay isNull F.minimum -maximumMay = liftMay isNull F.maximum - -minimumDef, maximumDef :: (Foldable t, Ord a) => a -> t a -> a -minimumDef def = fromMaybe def . minimumMay -maximumDef def = fromMaybe def . maximumMay +minimumMay = liftMay F.null F.minimum +maximumMay = liftMay F.null F.maximum minimumNote, maximumNote :: (Partial, Foldable t, Ord a) => String -> t a -> a minimumNote note x = withFrozenCallStack $ fromNote note "minimumNote on empty" $ minimumMay x maximumNote note x = withFrozenCallStack $ fromNote note "maximumNote on empty" $ maximumMay x minimumByMay, maximumByMay :: Foldable t => (a -> a -> Ordering) -> t a -> Maybe a -minimumByMay = liftMay isNull . F.minimumBy -maximumByMay = liftMay isNull . F.maximumBy - -minimumByDef, maximumByDef :: Foldable t => a -> (a -> a -> Ordering) -> t a -> a -minimumByDef def = fromMaybe def .^ minimumByMay -maximumByDef def = fromMaybe def .^ maximumByMay +minimumByMay = liftMay F.null . F.minimumBy +maximumByMay = liftMay F.null . F.maximumBy minimumByNote, maximumByNote :: (Partial, Foldable t) => String -> (a -> a -> Ordering) -> t a -> a minimumByNote note f x = withFrozenCallStack $ fromNote note "minimumByNote on empty" $ minimumByMay f x maximumByNote note f x = withFrozenCallStack $ fromNote note "maximumByNote on empty" $ maximumByMay f x +-- | The largest element of a foldable structure with respect to the +-- given comparison function. The result is bounded by the value given as the first argument. +maximumBoundBy :: Foldable f => a -> (a -> a -> Ordering) -> f a -> a +maximumBoundBy x f xs = maximumBy f $ x : toList xs + +-- | The smallest element of a foldable structure with respect to the +-- given comparison function. The result is bounded by the value given as the first argument. +minimumBoundBy :: Foldable f => a -> (a -> a -> Ordering) -> f a -> a +minimumBoundBy x f xs = minimumBy f $ x : toList xs + +-- | The largest element of a foldable structure. +-- The result is bounded by the value given as the first argument. +maximumBound :: (Foldable f, Ord a) => a -> f a -> a +maximumBound x xs = maximum $ x : toList xs + +-- | The smallest element of a foldable structure. +-- The result is bounded by the value given as the first argument. +minimumBound :: (Foldable f, Ord a) => a -> f a -> a +minimumBound x xs = minimum $ x : toList xs + +-- | The largest element of a foldable structure. +-- The result is bounded by 'minBound'. +maximumBounded :: (Foldable f, Ord a, Bounded a) => f a -> a +maximumBounded = maximumBound minBound + +-- | The largest element of a foldable structure. +-- The result is bounded by 'maxBound'. +minimumBounded :: (Foldable f, Ord a, Bounded a) => f a -> a +minimumBounded = minimumBound maxBound + -- | -- > findJust op = fromJust . find op findJust :: (Partial, Foldable t) => (a -> Bool) -> t a -> a @@ -102,7 +117,24 @@ foldr1Safe :: (Monoid m, Foldable t) => (m -> m -> m) -> t m -> m foldr1Safe fun = F.foldr fun mempty - {-# DEPRECATED findJustSafe "Use @findJustDef mempty@ instead." #-} findJustSafe :: (Monoid m, Foldable t) => (m -> Bool) -> t m -> m findJustSafe = findJustDef mempty + +{-# DEPRECATED minimumDef "Use @minimumBound@ instead." #-} +{-# DEPRECATED maximumDef "Use @maximumBound@ instead." #-} +minimumDef, maximumDef :: (Foldable t, Ord a) => a -> t a -> a +minimumDef def = fromMaybe def . minimumMay +maximumDef def = fromMaybe def . maximumMay + +{-# DEPRECATED minimumByDef "Use @minimumBoundBy@ instead." #-} +{-# DEPRECATED maximumByDef "Use @maximumBoundBy@ instead." #-} +minimumByDef, maximumByDef :: Foldable t => a -> (a -> a -> Ordering) -> t a -> a +minimumByDef def = fromMaybe def .^ minimumByMay +maximumByDef def = fromMaybe def .^ maximumByMay + +{-# DEPRECATED foldr1Def "Use @foldr1May@ instead." #-} +{-# DEPRECATED foldl1Def "Use @foldl1May@ instead." #-} +foldl1Def, foldr1Def :: Foldable t => a -> (a -> a -> a) -> t a -> a +foldl1Def def = fromMaybe def .^ foldl1May +foldr1Def def = fromMaybe def .^ foldr1May diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/safe-0.3.17/Safe.hs new/safe-0.3.18/Safe.hs --- old/safe-0.3.17/Safe.hs 2018-03-09 18:20:17.000000000 +0100 +++ new/safe-0.3.18/Safe.hs 2019-12-04 11:32:22.000000000 +0100 @@ -28,10 +28,13 @@ initMay, initDef, initNote, initSafe, headMay, headDef, headNote, lastMay, lastDef, lastNote, - minimumMay, minimumDef, minimumNote, - maximumMay, maximumDef, maximumNote, - minimumByMay, minimumByDef, minimumByNote, - maximumByMay, maximumByDef, maximumByNote, + minimumMay, minimumNote, + maximumMay, maximumNote, + minimumByMay, minimumByNote, + maximumByMay, maximumByNote, + minimumBoundBy, maximumBoundBy, + maximumBounded, maximumBound, + minimumBounded, minimumBound, foldr1May, foldr1Def, foldr1Note, foldl1May, foldl1Def, foldl1Note, foldl1May', foldl1Def', foldl1Note', @@ -50,6 +53,8 @@ succMay, succDef, succNote, succSafe, predMay, predDef, predNote, predSafe, indexMay, indexDef, indexNote, + -- * Deprecated + minimumDef, maximumDef, minimumByDef, maximumByDef ) where import Safe.Util @@ -144,10 +149,6 @@ minimumMay = liftMay null minimum maximumMay = liftMay null maximum -minimumDef, maximumDef :: Ord a => a -> [a] -> a -minimumDef def = fromMaybe def . minimumMay -maximumDef def = fromMaybe def . maximumMay - minimumNote, maximumNote :: (Partial, Ord a) => String -> [a] -> a minimumNote note x = withFrozenCallStack $ fromNote note "minumumNote []" $ minimumMay x maximumNote note x = withFrozenCallStack $ fromNote note "maximumNote []" $ maximumMay x @@ -156,25 +157,45 @@ minimumByMay = liftMay null . minimumBy maximumByMay = liftMay null . maximumBy -minimumByDef, maximumByDef :: a -> (a -> a -> Ordering) -> [a] -> a -minimumByDef def = fromMaybe def .^ minimumByMay -maximumByDef def = fromMaybe def .^ maximumByMay - minimumByNote, maximumByNote :: Partial => String -> (a -> a -> Ordering) -> [a] -> a minimumByNote note f x = withFrozenCallStack $ fromNote note "minumumByNote []" $ minimumByMay f x maximumByNote note f x = withFrozenCallStack $ fromNote note "maximumByNote []" $ maximumByMay f x +-- | The largest element of a list with respect to the +-- given comparison function. The result is bounded by the value given as the first argument. +maximumBoundBy :: a -> (a -> a -> Ordering) -> [a] -> a +maximumBoundBy x f xs = maximumBy f $ x : xs + +-- | The smallest element of a list with respect to the +-- given comparison function. The result is bounded by the value given as the first argument. +minimumBoundBy :: a -> (a -> a -> Ordering) -> [a] -> a +minimumBoundBy x f xs = minimumBy f $ x : xs + +-- | The largest element of a list. +-- The result is bounded by the value given as the first argument. +maximumBound :: Ord a => a -> [a] -> a +maximumBound x xs = maximum $ x : xs + +-- | The smallest element of a list. +-- The result is bounded by the value given as the first argument. +minimumBound :: Ord a => a -> [a] -> a +minimumBound x xs = minimum $ x : xs + +-- | The largest element of a list. +-- The result is bounded by 'minBound'. +maximumBounded :: (Ord a, Bounded a) => [a] -> a +maximumBounded = maximumBound minBound + +-- | The largest element of a list. +-- The result is bounded by 'maxBound'. +minimumBounded :: (Ord a, Bounded a) => [a] -> a +minimumBounded = minimumBound maxBound foldr1May, foldl1May, foldl1May' :: (a -> a -> a) -> [a] -> Maybe a foldr1May = liftMay null . foldr1 foldl1May = liftMay null . foldl1 foldl1May' = liftMay null . foldl1' -foldr1Def, foldl1Def, foldl1Def' :: a -> (a -> a -> a) -> [a] -> a -foldr1Def def = fromMaybe def .^ foldr1May -foldl1Def def = fromMaybe def .^ foldl1May -foldl1Def' def = fromMaybe def .^ foldl1May' - foldr1Note, foldl1Note, foldl1Note' :: Partial => String -> (a -> a -> a) -> [a] -> a foldr1Note note f x = withFrozenCallStack $ fromNote note "foldr1Note []" $ foldr1May f x foldl1Note note f x = withFrozenCallStack $ fromNote note "foldl1Note []" $ foldl1May f x @@ -344,3 +365,26 @@ indexNote :: (Partial, Ix a) => String -> (a, a) -> a -> Int indexNote note x y = withFrozenCallStack $ fromNote note "indexNote, out of range" $ indexMay x y + +--------------------------------------------------------------------- +-- DEPRECATED + +{-# DEPRECATED minimumDef "Use @minimumBound@ instead." #-} +{-# DEPRECATED maximumDef "Use @maximumBound@ instead." #-} +minimumDef, maximumDef :: Ord a => a -> [a] -> a +minimumDef def = fromMaybe def . minimumMay +maximumDef def = fromMaybe def . maximumMay + +{-# DEPRECATED minimumByDef "Use @minimumBoundBy@ instead." #-} +{-# DEPRECATED maximumByDef "Use @maximumBoundBy@ instead." #-} +minimumByDef, maximumByDef :: a -> (a -> a -> Ordering) -> [a] -> a +minimumByDef def = fromMaybe def .^ minimumByMay +maximumByDef def = fromMaybe def .^ maximumByMay + +{-# DEPRECATED foldr1Def "Use @foldr1May@ instead." #-} +{-# DEPRECATED foldl1Def "Use @foldl1May@ instead." #-} +{-# DEPRECATED foldl1Def' "Use @foldl1May'@ instead." #-} +foldr1Def, foldl1Def, foldl1Def' :: a -> (a -> a -> a) -> [a] -> a +foldr1Def def = fromMaybe def .^ foldr1May +foldl1Def def = fromMaybe def .^ foldl1May +foldl1Def' def = fromMaybe def .^ foldl1May' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/safe-0.3.17/safe.cabal new/safe-0.3.18/safe.cabal --- old/safe-0.3.17/safe.cabal 2018-03-09 18:20:17.000000000 +0100 +++ new/safe-0.3.18/safe.cabal 2019-12-04 11:33:01.000000000 +0100 @@ -1,17 +1,17 @@ cabal-version: >= 1.18 build-type: Simple name: safe -version: 0.3.17 +version: 0.3.18 license: BSD3 license-file: LICENSE category: Unclassified author: Neil Mitchell <[email protected]> maintainer: Neil Mitchell <[email protected]> -copyright: Neil Mitchell 2007-2018 +copyright: Neil Mitchell 2007-2019 homepage: https://github.com/ndmitchell/safe#readme synopsis: Library of safe (exception free) functions bug-reports: https://github.com/ndmitchell/safe/issues -tested-with: GHC==8.2.2, GHC==8.0.2, GHC==7.10.3, GHC==7.8.4, GHC==7.6.3, GHC==7.4.2 +tested-with: GHC==8.8.1, GHC==8.6.5, GHC==8.4.4, GHC==8.2.2, GHC==8.0.2, GHC==7.10.3 description: A library wrapping @Prelude@/@Data.List@ functions that can throw exceptions, such as @head@ and @!!@. Each unsafe function has up to four variants, e.g. with @tail@: ++++++ safe.cabal ++++++ cabal-version: >= 1.18 build-type: Simple name: safe version: 0.3.18 x-revision: 1 license: BSD3 license-file: LICENSE category: Unclassified author: Neil Mitchell <[email protected]> maintainer: Neil Mitchell <[email protected]> copyright: Neil Mitchell 2007-2019 homepage: https://github.com/ndmitchell/safe#readme synopsis: Library of safe (exception free) functions bug-reports: https://github.com/ndmitchell/safe/issues tested-with: GHC==8.8.1, GHC==8.6.5, GHC==8.4.4, GHC==8.2.2, GHC==8.0.2, GHC==7.10.3 description: A library wrapping @Prelude@/@Data.List@ functions that can throw exceptions, such as @head@ and @!!@. Each unsafe function has up to four variants, e.g. with @tail@: . * @tail :: [a] -> [a]@, raises an error on @tail []@. . * @tailMay :: [a] -> /Maybe/ [a]@, turns errors into @Nothing@. . * @tailDef :: /[a]/ -> [a] -> [a]@, takes a default to return on errors. . * @tailNote :: /String/ -> [a] -> [a]@, takes an extra argument which supplements the error message. . * @tailSafe :: [a] -> [a]@, returns some sensible default if possible, @[]@ in the case of @tail@. . This package is divided into three modules: . * "Safe" contains safe variants of @Prelude@ and @Data.List@ functions. . * "Safe.Foldable" contains safe variants of @Foldable@ functions. . * "Safe.Exact" creates crashing versions of functions like @zip@ (errors if the lists are not equal) and @take@ (errors if there are not enough elements), then wraps them to provide safe variants. extra-doc-files: CHANGES.txt README.md source-repository head type: git location: https://github.com/ndmitchell/safe.git library default-language: Haskell2010 build-depends: base >= 4.8 && < 5 exposed-modules: Safe Safe.Exact Safe.Foldable Safe.Partial other-modules: Safe.Util test-suite safe-test type: exitcode-stdio-1.0 main-is: Test.hs default-language: Haskell2010 other-modules: Safe Safe.Exact Safe.Foldable Safe.Partial Safe.Util build-depends: base, deepseq, QuickCheck, safe
