packages feed

strongweak-0.1.0: src/Strongweak/Example.hs

module Strongweak.Example where

import Strongweak
import Strongweak.Generic

import GHC.Generics ( Generic )

import Data.Word ( Word8 )

import Refined hiding ( Weaken(..) )
import Numeric.Natural

data Ex1D (s :: Strength) = Ex1C
  { ex1f1 :: SW s Word8
  , ex1f2 :: SW s (Refined (LessThan 100) Natural)
  } deriving stock Generic
deriving stock instance Show (Ex1D 'Strong)
deriving stock instance Show (Ex1D 'Weak)
instance Weaken     (Ex1D 'Strong) (Ex1D 'Weak)   where weaken     = weakenGeneric
instance Strengthen (Ex1D 'Weak)   (Ex1D 'Strong) where strengthen = strengthenGeneric

data Ex2D (s :: Strength) = Ex2C
  { ex2f1 :: Ex1D s
  , ex2f2 :: SW s Word8
  } deriving stock Generic
deriving stock instance Show (Ex2D 'Strong)
deriving stock instance Show (Ex2D 'Weak)
instance Weaken     (Ex2D 'Strong) (Ex2D 'Weak)   where weaken     = weakenGeneric
instance Strengthen (Ex2D 'Weak)   (Ex2D 'Strong) where strengthen = strengthenGeneric

ex1w :: Ex1D 'Weak
ex1w = Ex1C 256 210

ex2w :: Ex2D 'Weak
ex2w = Ex2C ex1w 256

data ExVoid (s :: Strength) deriving stock Generic
instance Weaken     (ExVoid 'Strong) (ExVoid 'Weak)   where weaken     = weakenGeneric
instance Strengthen (ExVoid 'Weak)   (ExVoid 'Strong) where strengthen = strengthenGeneric

data ExUnit (s :: Strength) = ExUnit deriving stock Generic
instance Weaken     (ExUnit 'Strong) (ExUnit 'Weak)   where weaken     = weakenGeneric
instance Strengthen (ExUnit 'Weak)   (ExUnit 'Strong) where strengthen = strengthenGeneric