-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Convert between strong and weak representations of types -- -- Please see README.md. @package strongweak @version 0.1.0 module Strongweak.SW data Strength Strong :: Strength Weak :: Strength -- | Obtain the weak representation of the given type. type family Weak (a :: Type) :: Type -- | Obtain either the strong or weak representation of a type, depending -- on the type-level strength "switch" provided. -- -- This is intended to be used in data types that take a Strength -- type. Define your type using strong fields wrapped in Switch -- s. You then get the weak representation for free, using the same -- definition. -- --
-- data A (s :: Strength) = A
-- { aField1 :: Switch s Word8
-- , aField2 :: String }
--
type family SW (s :: Strength) a :: Type
module Strongweak.Strengthen
-- | Any w can be "strengthened" into an s by asserting
-- some properties.
--
-- For example, you may strengthen some Natural n into a
-- Word8 by asserting 0 <= n <= 255.
--
-- Note that we restrict strengthened types to having only one
-- corresponding weak representation using functional dependencies.
class Strengthen w s | s -> w
strengthen :: Strengthen w s => w -> Validation (NonEmpty StrengthenError) s
data StrengthenError
-- | weak type, strong type, weak value, msg
StrengthenErrorBase :: String -> String -> String -> String -> StrengthenError
-- | weak datatype name, strong datatype name, weak constructor name,
-- strong constructor name, weak field name, strong field name, error
StrengthenErrorField :: String -> String -> String -> String -> String -> String -> StrengthenError -> StrengthenError
strengthenErrorBase :: forall s w. (Typeable w, Show w, Typeable s) => w -> String -> Validation (NonEmpty StrengthenError) s
strengthenErrorPretty :: NonEmpty StrengthenError -> Doc a
strengthenBounded :: forall b n. (Integral b, Bounded b, Show b, Typeable b, Integral n, Show n, Typeable n) => n -> Validation (NonEmpty StrengthenError) b
instance Strongweak.Strengthen.Strengthen w s => Strongweak.Strengthen.Strengthen [w] [s]
instance (GHC.TypeNats.KnownNat n, Data.Typeable.Internal.Typeable a, GHC.Show.Show a) => Strongweak.Strengthen.Strengthen [a] (Data.Vector.Sized.Vector n a)
instance (Refined.Predicate p a, Data.Typeable.Internal.Typeable a, GHC.Show.Show a) => Strongweak.Strengthen.Strengthen a (Refined.Unsafe.Type.Refined p a)
instance Strongweak.Strengthen.Strengthen GHC.Num.Natural.Natural GHC.Word.Word8
instance Strongweak.Strengthen.Strengthen GHC.Num.Natural.Natural GHC.Word.Word16
instance Strongweak.Strengthen.Strengthen GHC.Num.Natural.Natural GHC.Word.Word32
instance Strongweak.Strengthen.Strengthen GHC.Num.Natural.Natural GHC.Word.Word64
instance Strongweak.Strengthen.Strengthen GHC.Num.Integer.Integer GHC.Int.Int8
instance Strongweak.Strengthen.Strengthen GHC.Num.Integer.Integer GHC.Int.Int16
instance Strongweak.Strengthen.Strengthen GHC.Num.Integer.Integer GHC.Int.Int32
instance Strongweak.Strengthen.Strengthen GHC.Num.Integer.Integer GHC.Int.Int64
instance GHC.Show.Show Strongweak.Strengthen.StrengthenError
instance Prettyprinter.Internal.Pretty Strongweak.Strengthen.StrengthenError
-- | The generic derivation is split into 3 classes, dealing with different
-- layers of a Haskell data type: datatype, constructor and selector. At
-- each point, we gather up information about the type and push on.
-- Strengthening occurs at selectors. If a strengthening fails, the
-- gathered information is pushed into an error that wraps the original
-- error.
module Strongweak.Generic.Strengthen
strengthenGeneric :: (Generic w, Generic s, GStrengthenD (Rep w) (Rep s)) => w -> Validation (NonEmpty StrengthenError) s
class GStrengthenD w s
gstrengthenD :: GStrengthenD w s => w p -> Validation (NonEmpty StrengthenError) (s p)
class GStrengthenC w s
gstrengthenC :: GStrengthenC w s => String -> String -> w p -> Validation (NonEmpty StrengthenError) (s p)
class GStrengthenS w s
gstrengthenS :: GStrengthenS w s => String -> String -> String -> String -> w p -> Validation (NonEmpty StrengthenError) (s p)
-- | conName without the value (only used as a proxy). Lets us push
-- our undefineds into one place.
conName' :: forall c. Constructor c => String
-- | datatypeName without the value (only used as a proxy). Lets us
-- push our undefineds into one place.
datatypeName' :: forall d. Datatype d => String
-- | datatypeName without the value (only used as a proxy). Lets us
-- push our undefineds into one place.
selName' :: forall s. Selector s => String
instance forall k (w :: k -> *) (s :: k -> *) (cw :: GHC.Generics.Meta) (cs :: GHC.Generics.Meta). (Strongweak.Generic.Strengthen.GStrengthenS w s, GHC.Generics.Constructor cw, GHC.Generics.Constructor cs) => Strongweak.Generic.Strengthen.GStrengthenC (GHC.Generics.C1 cw w) (GHC.Generics.C1 cs s)
instance Strongweak.Generic.Strengthen.GStrengthenS GHC.Generics.U1 GHC.Generics.U1
instance Strongweak.Generic.Strengthen.GStrengthenS (GHC.Generics.S1 mw (GHC.Generics.Rec0 w)) (GHC.Generics.S1 ms (GHC.Generics.Rec0 w))
instance (Strongweak.Strengthen.Strengthen w s, GHC.Generics.Selector mw, GHC.Generics.Selector ms) => Strongweak.Generic.Strengthen.GStrengthenS (GHC.Generics.S1 mw (GHC.Generics.Rec0 w)) (GHC.Generics.S1 ms (GHC.Generics.Rec0 s))
instance forall k (lw :: k -> *) (ls :: k -> *) (rw :: k -> *) (rs :: k -> *). (Strongweak.Generic.Strengthen.GStrengthenS lw ls, Strongweak.Generic.Strengthen.GStrengthenS rw rs) => Strongweak.Generic.Strengthen.GStrengthenS (lw GHC.Generics.:*: rw) (ls GHC.Generics.:*: rs)
instance forall k (w :: k -> *) (s :: k -> *) (dw :: GHC.Generics.Meta) (ds :: GHC.Generics.Meta). (Strongweak.Generic.Strengthen.GStrengthenC w s, GHC.Generics.Datatype dw, GHC.Generics.Datatype ds) => Strongweak.Generic.Strengthen.GStrengthenD (GHC.Generics.D1 dw w) (GHC.Generics.D1 ds s)
instance Strongweak.Generic.Strengthen.GStrengthenC GHC.Generics.V1 GHC.Generics.V1
instance forall k (lw :: k -> *) (ls :: k -> *) (rw :: k -> *) (rs :: k -> *). (Strongweak.Generic.Strengthen.GStrengthenC lw ls, Strongweak.Generic.Strengthen.GStrengthenC rw rs) => Strongweak.Generic.Strengthen.GStrengthenC (lw GHC.Generics.:+: rw) (ls GHC.Generics.:+: rs)
module Strongweak.Weaken
-- | Any s can be "weakened" into a w.
--
-- For example, you may weaken a Word8 into a Natural.
--
-- Note that we restrict strengthened types to having only one
-- corresponding weak representation using functional dependencies.
class Weaken s w | s -> w
weaken :: Weaken s w => s -> w
instance Strongweak.Weaken.Weaken s w => Strongweak.Weaken.Weaken [s] [w]
instance Strongweak.Weaken.Weaken (Data.Vector.Sized.Vector n a) [a]
instance Strongweak.Weaken.Weaken (Refined.Unsafe.Type.Refined p a) a
instance Strongweak.Weaken.Weaken GHC.Word.Word8 GHC.Num.Natural.Natural
instance Strongweak.Weaken.Weaken GHC.Word.Word16 GHC.Num.Natural.Natural
instance Strongweak.Weaken.Weaken GHC.Word.Word32 GHC.Num.Natural.Natural
instance Strongweak.Weaken.Weaken GHC.Word.Word64 GHC.Num.Natural.Natural
instance Strongweak.Weaken.Weaken GHC.Int.Int8 GHC.Num.Integer.Integer
instance Strongweak.Weaken.Weaken GHC.Int.Int16 GHC.Num.Integer.Integer
instance Strongweak.Weaken.Weaken GHC.Int.Int32 GHC.Num.Integer.Integer
instance Strongweak.Weaken.Weaken GHC.Int.Int64 GHC.Num.Integer.Integer
module Strongweak.Generic.Weaken
weakenGeneric :: (Generic s, Generic w, GWeaken (Rep s) (Rep w)) => s -> w
class GWeaken s w
gweaken :: GWeaken s w => s p -> w p
instance forall k (s :: k -> *) (w :: k -> *) is (ms :: GHC.Generics.Meta) iw (mw :: GHC.Generics.Meta). Strongweak.Generic.Weaken.GWeaken s w => Strongweak.Generic.Weaken.GWeaken (GHC.Generics.M1 is ms s) (GHC.Generics.M1 iw mw w)
instance Strongweak.Generic.Weaken.GWeaken GHC.Generics.V1 GHC.Generics.V1
instance Strongweak.Generic.Weaken.GWeaken GHC.Generics.U1 GHC.Generics.U1
instance Strongweak.Generic.Weaken.GWeaken (GHC.Generics.Rec0 s) (GHC.Generics.Rec0 s)
instance Strongweak.Weaken.Weaken s w => Strongweak.Generic.Weaken.GWeaken (GHC.Generics.Rec0 s) (GHC.Generics.Rec0 w)
instance forall k (ls :: k -> *) (lw :: k -> *) (rs :: k -> *) (rw :: k -> *). (Strongweak.Generic.Weaken.GWeaken ls lw, Strongweak.Generic.Weaken.GWeaken rs rw) => Strongweak.Generic.Weaken.GWeaken (ls GHC.Generics.:*: rs) (lw GHC.Generics.:*: rw)
instance forall k (ls :: k -> *) (lw :: k -> *) (rs :: k -> *) (rw :: k -> *). (Strongweak.Generic.Weaken.GWeaken ls lw, Strongweak.Generic.Weaken.GWeaken rs rw) => Strongweak.Generic.Weaken.GWeaken (ls GHC.Generics.:+: rs) (lw GHC.Generics.:+: rw)
module Strongweak.Generic
weakenGeneric :: (Generic s, Generic w, GWeaken (Rep s) (Rep w)) => s -> w
strengthenGeneric :: (Generic w, Generic s, GStrengthenD (Rep w) (Rep s)) => w -> Validation (NonEmpty StrengthenError) s
module Strongweak
module Strongweak.Example
data Ex1D (s :: Strength)
Ex1C :: SW s Word8 -> SW s (Refined (LessThan 100) Natural) -> Ex1D (s :: Strength)
[ex1f1] :: Ex1D (s :: Strength) -> SW s Word8
[ex1f2] :: Ex1D (s :: Strength) -> SW s (Refined (LessThan 100) Natural)
data Ex2D (s :: Strength)
Ex2C :: Ex1D s -> SW s Word8 -> Ex2D (s :: Strength)
[ex2f1] :: Ex2D (s :: Strength) -> Ex1D s
[ex2f2] :: Ex2D (s :: Strength) -> SW s Word8
ex1w :: Ex1D 'Weak
ex2w :: Ex2D 'Weak
data ExVoid (s :: Strength)
data ExUnit (s :: Strength)
ExUnit :: ExUnit (s :: Strength)
instance GHC.Generics.Generic (Strongweak.Example.Ex1D s)
instance GHC.Generics.Generic (Strongweak.Example.Ex2D s)
instance GHC.Generics.Generic (Strongweak.Example.ExVoid s)
instance GHC.Generics.Generic (Strongweak.Example.ExUnit s)
instance GHC.Show.Show (Strongweak.Example.Ex1D 'Strongweak.SW.Strong)
instance GHC.Show.Show (Strongweak.Example.Ex1D 'Strongweak.SW.Weak)
instance GHC.Show.Show (Strongweak.Example.Ex2D 'Strongweak.SW.Strong)
instance GHC.Show.Show (Strongweak.Example.Ex2D 'Strongweak.SW.Weak)
instance Strongweak.Weaken.Weaken (Strongweak.Example.ExUnit 'Strongweak.SW.Strong) (Strongweak.Example.ExUnit 'Strongweak.SW.Weak)
instance Strongweak.Strengthen.Strengthen (Strongweak.Example.ExUnit 'Strongweak.SW.Weak) (Strongweak.Example.ExUnit 'Strongweak.SW.Strong)
instance Strongweak.Weaken.Weaken (Strongweak.Example.ExVoid 'Strongweak.SW.Strong) (Strongweak.Example.ExVoid 'Strongweak.SW.Weak)
instance Strongweak.Strengthen.Strengthen (Strongweak.Example.ExVoid 'Strongweak.SW.Weak) (Strongweak.Example.ExVoid 'Strongweak.SW.Strong)
instance Strongweak.Weaken.Weaken (Strongweak.Example.Ex2D 'Strongweak.SW.Strong) (Strongweak.Example.Ex2D 'Strongweak.SW.Weak)
instance Strongweak.Strengthen.Strengthen (Strongweak.Example.Ex2D 'Strongweak.SW.Weak) (Strongweak.Example.Ex2D 'Strongweak.SW.Strong)
instance Strongweak.Weaken.Weaken (Strongweak.Example.Ex1D 'Strongweak.SW.Strong) (Strongweak.Example.Ex1D 'Strongweak.SW.Weak)
instance Strongweak.Strengthen.Strengthen (Strongweak.Example.Ex1D 'Strongweak.SW.Weak) (Strongweak.Example.Ex1D 'Strongweak.SW.Strong)