module Refined.Implies where
import Refined (Refined, Predicate(..))
import Refined (EqualTo, LessThan)
import Refined.LessThanEq (LessThanEq)
import Refined.Length (Length)
import Data.Monoid ((<>))
import Data.Coerce (coerce)
import Data.CharLength (CharLength(..))
import GHC.TypeLits
class Implies from to where
relax :: Refined from x -> Refined to x
relax = coerce
instance (n <= m) => Implies (LessThan n) (LessThan m)
instance (n + 1 <= m) => Implies (EqualTo n) (LessThan m)
instance (n <= m) => Implies (EqualTo n) (LessThanEq m)
instance (Implies m n) => Implies (Length m) (Length n)