symantic-base 0.0.2.20200708 → 0.1.0.20210703
raw patch · 32 files changed
+1924/−1366 lines, 32 filesdep +containersdep +hashabledep +template-haskellPVP ok
version bump matches the API change (PVP)
Dependencies added: containers, hashable, template-haskell, transformers, unordered-containers
API changes (from Hackage documentation)
- Symantic.Base.ADT: adtOfeot :: Generic a => RepOfEoT a => EoT (ADT a) -> a
- Symantic.Base.ADT: class EithersOfRep (a :: * -> *) ss
- Symantic.Base.ADT: class FieldOfRep (a :: * -> *)
- Symantic.Base.ADT: class RepOfEithers (a :: * -> *) ss
- Symantic.Base.ADT: class RepOfField (a :: * -> *)
- Symantic.Base.ADT: class RepOfTuples (a :: * -> *) (xs :: [*])
- Symantic.Base.ADT: class TuplesOfRep (a :: * -> *) (ps :: [*])
- Symantic.Base.ADT: eithersOfRepL :: EithersOfRep a ss => a x -> EoT (ListOfRepSums a ss)
- Symantic.Base.ADT: eithersOfRepR :: EithersOfRep a ss => EoT ss -> EoT (ListOfRepSums a ss)
- Symantic.Base.ADT: eotOfadt :: Generic a => EoTOfRep a => a -> EoT (ADT a)
- Symantic.Base.ADT: fieldOfRep :: FieldOfRep a => a x -> TypeOfRepField a
- Symantic.Base.ADT: instance (Symantic.Base.ADT.EithersOfRep a (Symantic.Base.ADT.ListOfRepSums b ss), Symantic.Base.ADT.EithersOfRep b ss) => Symantic.Base.ADT.EithersOfRep (a GHC.Generics.:+: b) ss
- Symantic.Base.ADT: instance (Symantic.Base.ADT.RepOfEithers a (Symantic.Base.ADT.ListOfRepSums b ss), Symantic.Base.ADT.RepOfEithers b ss) => Symantic.Base.ADT.RepOfEithers (a GHC.Generics.:+: b) ss
- Symantic.Base.ADT: instance (Symantic.Base.ADT.RepOfTuples a (Symantic.Base.ADT.ListOfRepProducts b ps), Symantic.Base.ADT.RepOfTuples b ps) => Symantic.Base.ADT.RepOfTuples (a GHC.Generics.:*: b) ps
- Symantic.Base.ADT: instance (Symantic.Base.ADT.TuplesOfRep a (Symantic.Base.ADT.ListOfRepProducts b ps), Symantic.Base.ADT.TuplesOfRep b ps) => Symantic.Base.ADT.TuplesOfRep (a GHC.Generics.:*: b) ps
- Symantic.Base.ADT: instance Symantic.Base.ADT.EithersOfRep GHC.Generics.V1 ss
- Symantic.Base.ADT: instance Symantic.Base.ADT.EithersOfRep a ss => Symantic.Base.ADT.EithersOfRep (GHC.Generics.M1 GHC.Generics.D c a) ss
- Symantic.Base.ADT: instance Symantic.Base.ADT.FieldOfRep (GHC.Generics.K1 i a)
- Symantic.Base.ADT: instance Symantic.Base.ADT.FieldOfRep a => Symantic.Base.ADT.TuplesOfRep (GHC.Generics.M1 GHC.Generics.S c a) '[]
- Symantic.Base.ADT: instance Symantic.Base.ADT.FieldOfRep a => Symantic.Base.ADT.TuplesOfRep (GHC.Generics.M1 GHC.Generics.S c a) (x : ps)
- Symantic.Base.ADT: instance Symantic.Base.ADT.RepOfEithers GHC.Generics.V1 ss
- Symantic.Base.ADT: instance Symantic.Base.ADT.RepOfEithers a ss => Symantic.Base.ADT.RepOfEithers (GHC.Generics.M1 GHC.Generics.D c a) ss
- Symantic.Base.ADT: instance Symantic.Base.ADT.RepOfField (GHC.Generics.K1 i a)
- Symantic.Base.ADT: instance Symantic.Base.ADT.RepOfField a => Symantic.Base.ADT.RepOfTuples (GHC.Generics.M1 GHC.Generics.S c a) '[]
- Symantic.Base.ADT: instance Symantic.Base.ADT.RepOfField a => Symantic.Base.ADT.RepOfTuples (GHC.Generics.M1 GHC.Generics.S c a) (p : ps)
- Symantic.Base.ADT: instance Symantic.Base.ADT.RepOfTuples GHC.Generics.U1 ps
- Symantic.Base.ADT: instance Symantic.Base.ADT.RepOfTuples a '[] => Symantic.Base.ADT.RepOfEithers (GHC.Generics.M1 GHC.Generics.C c a) '[]
- Symantic.Base.ADT: instance Symantic.Base.ADT.RepOfTuples a '[] => Symantic.Base.ADT.RepOfEithers (GHC.Generics.M1 GHC.Generics.C c a) (ps : ss)
- Symantic.Base.ADT: instance Symantic.Base.ADT.TuplesOfRep GHC.Generics.U1 ps
- Symantic.Base.ADT: instance Symantic.Base.ADT.TuplesOfRep a '[] => Symantic.Base.ADT.EithersOfRep (GHC.Generics.M1 GHC.Generics.C c a) '[]
- Symantic.Base.ADT: instance Symantic.Base.ADT.TuplesOfRep a '[] => Symantic.Base.ADT.EithersOfRep (GHC.Generics.M1 GHC.Generics.C c a) (ps : ss)
- Symantic.Base.ADT: repOfEithers :: RepOfEithers a ss => EoT (ListOfRepSums a ss) -> (a x -> r) -> (EoT ss -> r) -> r
- Symantic.Base.ADT: repOfField :: RepOfField a => TypeOfRepField a -> a x
- Symantic.Base.ADT: repOfTuples :: RepOfTuples a xs => Tuples (ListOfRepProducts a xs) -> (a x -> Tuples xs -> r) -> r
- Symantic.Base.ADT: tuplesOfRep :: TuplesOfRep a ps => a x -> Tuples ps -> Tuples (ListOfRepProducts a ps)
- Symantic.Base.ADT: type ADT (adt :: *) = ListOfRepSums (Rep adt) '[]
- Symantic.Base.ADT: type EoTOfRep a = EithersOfRep (Rep a) '[]
- Symantic.Base.ADT: type RepOfEoT a = RepOfEithers (Rep a) '[]
- Symantic.Base.ADT: type family TypeOfRepField (a :: * -> *) :: *
- Symantic.Base.Algebrable: (<+>) :: Eitherable repr => repr (a -> k) k -> repr (b -> k) k -> repr (Either a b -> k) k
- Symantic.Base.Algebrable: (<->) :: Substractable repr => repr a k -> repr k' k' -> repr a k
- Symantic.Base.Algebrable: (<:>) :: Tupable repr => repr (a -> k) k -> repr (b -> k) k -> repr ((a, b) -> k) k
- Symantic.Base.Algebrable: adt :: forall adt repr k. Dimapable repr => Generic adt => RepOfEoT adt => EoTOfRep adt => repr (EoT (ADT adt) -> k) k -> repr (adt -> k) k
- Symantic.Base.Algebrable: class Constant repr
- Symantic.Base.Algebrable: class Dicurryable repr
- Symantic.Base.Algebrable: class Eitherable repr
- Symantic.Base.Algebrable: class Emptyable repr
- Symantic.Base.Algebrable: class Optionable repr
- Symantic.Base.Algebrable: class Repeatable repr
- Symantic.Base.Algebrable: class Substractable repr
- Symantic.Base.Algebrable: class Tupable repr
- Symantic.Base.Algebrable: class Unitable repr
- Symantic.Base.Algebrable: constant :: Constant repr => a -> repr (a -> k) k
- Symantic.Base.Algebrable: construct :: forall args a k repr. Dicurryable repr => Generic a => EoTOfRep a => CurryN args => Tuples args ~ EoT (ADT a) => args ~ Args (args -..-> a) => (args -..-> a) -> repr (args -..-> k) k -> repr (a -> k) k
- Symantic.Base.Algebrable: dicurry :: (Dicurryable repr, Transformable repr) => Dicurryable (UnTrans repr) => CurryN args => proxy args -> (args -..-> r) -> (r -> Tuples args) -> repr (args -..-> k) k -> repr (r -> k) k
- Symantic.Base.Algebrable: empty :: Emptyable repr => repr k k
- Symantic.Base.Algebrable: infixr 3 <->
- Symantic.Base.Algebrable: infixr 4 <:>
- Symantic.Base.Algebrable: many0 :: Repeatable repr => repr (a -> k) k -> repr ([a] -> k) k
- Symantic.Base.Algebrable: many1 :: Repeatable repr => repr (a -> k) k -> repr ([a] -> k) k
- Symantic.Base.Algebrable: option :: Optionable repr => repr k k -> repr k k
- Symantic.Base.Algebrable: optional :: Optionable repr => repr (a -> k) k -> repr (Maybe a -> k) k
- Symantic.Base.Algebrable: unit :: Unitable repr => repr (() -> k) k
- Symantic.Base.Composable: (<.>) :: Composable repr => repr a b -> repr b c -> repr a c
- Symantic.Base.Composable: -- | The underlying representation that <tt>(repr)</tt> transforms.
- Symantic.Base.Composable: IdentityTrans :: repr a k -> IdentityTrans repr a k
- Symantic.Base.Composable: [unIdentityTrans] :: IdentityTrans repr a k -> repr a k
- Symantic.Base.Composable: class Composable repr
- Symantic.Base.Composable: class Dimapable repr
- Symantic.Base.Composable: class Transformable repr where {
- Symantic.Base.Composable: class Voidable repr
- Symantic.Base.Composable: dimap :: Dimapable repr => (a -> b) -> (b -> a) -> repr (a -> k) k -> repr (b -> k) k
- Symantic.Base.Composable: infixr 4 <.>
- Symantic.Base.Composable: instance Symantic.Base.Composable.Transformable (Symantic.Base.Composable.IdentityTrans repr)
- Symantic.Base.Composable: newtype IdentityTrans repr a k
- Symantic.Base.Composable: noTrans :: Transformable repr => UnTrans repr a b -> repr a b
- Symantic.Base.Composable: trans1 :: Transformable repr => (UnTrans repr a b -> UnTrans repr c d) -> repr a b -> repr c d
- Symantic.Base.Composable: trans2 :: Transformable repr => (UnTrans repr a b -> UnTrans repr c d -> UnTrans repr e f) -> repr a b -> repr c d -> repr e f
- Symantic.Base.Composable: type family UnTrans repr :: * -> * -> *;
- Symantic.Base.Composable: unTrans :: Transformable repr => repr a b -> UnTrans repr a b
- Symantic.Base.Composable: void :: Voidable repr => a -> repr (a -> b) k -> repr b k
- Symantic.Base.Composable: }
- Symantic.Base.CurryN: class CurryN args
- Symantic.Base.CurryN: curryN :: CurryN args => (Tuples args -> res) -> args -..-> res
- Symantic.Base.CurryN: instance Symantic.Base.CurryN.CurryN '[a]
- Symantic.Base.CurryN: instance Symantic.Base.CurryN.CurryN (b : as) => Symantic.Base.CurryN.CurryN (a : b : as)
- Symantic.Base.CurryN: mapresultN :: CurryN args => (a -> b) -> (args -..-> a) -> args -..-> b
- Symantic.Base.CurryN: type family Result (as :: *) :: *
- Symantic.Base.CurryN: uncurryN :: CurryN args => (args -..-> res) -> Tuples args -> res
- Symantic.Base.Fixity: AssocB :: Side -> Associativity
- Symantic.Base.Fixity: AssocL :: Associativity
- Symantic.Base.Fixity: AssocR :: Associativity
- Symantic.Base.Fixity: Fixity1 :: Unifix -> Fixity
- Symantic.Base.Fixity: Fixity2 :: Infix -> Fixity
- Symantic.Base.Fixity: Infix :: Maybe Associativity -> Precedence -> Infix
- Symantic.Base.Fixity: Postfix :: Precedence -> Unifix
- Symantic.Base.Fixity: Prefix :: Precedence -> Unifix
- Symantic.Base.Fixity: SideL :: Side
- Symantic.Base.Fixity: SideR :: Side
- Symantic.Base.Fixity: [infix_associativity] :: Infix -> Maybe Associativity
- Symantic.Base.Fixity: [infix_precedence] :: Infix -> Precedence
- Symantic.Base.Fixity: [unifix_precedence] :: Unifix -> Precedence
- Symantic.Base.Fixity: class PrecedenceOf a
- Symantic.Base.Fixity: data Associativity
- Symantic.Base.Fixity: data Fixity
- Symantic.Base.Fixity: data Infix
- Symantic.Base.Fixity: data Side
- Symantic.Base.Fixity: data Unifix
- Symantic.Base.Fixity: infixB :: Side -> Precedence -> Infix
- Symantic.Base.Fixity: infixL :: Precedence -> Infix
- Symantic.Base.Fixity: infixN :: Precedence -> Infix
- Symantic.Base.Fixity: infixN0 :: Infix
- Symantic.Base.Fixity: infixN5 :: Infix
- Symantic.Base.Fixity: infixR :: Precedence -> Infix
- Symantic.Base.Fixity: instance GHC.Classes.Eq Symantic.Base.Fixity.Associativity
- Symantic.Base.Fixity: instance GHC.Classes.Eq Symantic.Base.Fixity.Fixity
- Symantic.Base.Fixity: instance GHC.Classes.Eq Symantic.Base.Fixity.Infix
- Symantic.Base.Fixity: instance GHC.Classes.Eq Symantic.Base.Fixity.Side
- Symantic.Base.Fixity: instance GHC.Classes.Eq Symantic.Base.Fixity.Unifix
- Symantic.Base.Fixity: instance GHC.Show.Show Symantic.Base.Fixity.Associativity
- Symantic.Base.Fixity: instance GHC.Show.Show Symantic.Base.Fixity.Fixity
- Symantic.Base.Fixity: instance GHC.Show.Show Symantic.Base.Fixity.Infix
- Symantic.Base.Fixity: instance GHC.Show.Show Symantic.Base.Fixity.Side
- Symantic.Base.Fixity: instance GHC.Show.Show Symantic.Base.Fixity.Unifix
- Symantic.Base.Fixity: instance Symantic.Base.Fixity.PrecedenceOf Symantic.Base.Fixity.Fixity
- Symantic.Base.Fixity: instance Symantic.Base.Fixity.PrecedenceOf Symantic.Base.Fixity.Infix
- Symantic.Base.Fixity: instance Symantic.Base.Fixity.PrecedenceOf Symantic.Base.Fixity.Unifix
- Symantic.Base.Fixity: isPairNeeded :: (Infix, Side) -> Infix -> Bool
- Symantic.Base.Fixity: pairAngle :: Pair
- Symantic.Base.Fixity: pairBrace :: Pair
- Symantic.Base.Fixity: pairBracket :: Pair
- Symantic.Base.Fixity: pairIfNeeded :: Semigroup s => IsString s => Pair -> (Infix, Side) -> Infix -> s -> s
- Symantic.Base.Fixity: pairParen :: Pair
- Symantic.Base.Fixity: precedence :: PrecedenceOf a => a -> Precedence
- Symantic.Base.Fixity: type Pair = (String, String)
- Symantic.Base.Fixity: type Precedence = Int
- Symantic.Base.Permutable: (<&>) :: Permutable repr => Tupable (Permutation repr) => repr (a -> k) k -> Permutation repr (b -> k) k -> Permutation repr ((a, b) -> k) k
- Symantic.Base.Permutable: (<*&>) :: Eitherable repr => Repeatable repr => Dimapable repr => Permutable repr => Tupable (Permutation repr) => repr (a -> k) k -> Permutation repr (b -> k) k -> Permutation repr (([a], b) -> k) k
- Symantic.Base.Permutable: (<+&>) :: Eitherable repr => Repeatable repr => Dimapable repr => Permutable repr => Tupable (Permutation repr) => repr (a -> k) k -> Permutation repr (b -> k) k -> Permutation repr (([a], b) -> k) k
- Symantic.Base.Permutable: (<?&>) :: Eitherable repr => Dimapable repr => Permutable repr => Tupable (Permutation repr) => repr (a -> k) k -> Permutation repr (b -> k) k -> Permutation repr ((Maybe a, b) -> k) k
- Symantic.Base.Permutable: class Permutable repr where {
- Symantic.Base.Permutable: infixr 4 <+&>
- Symantic.Base.Permutable: noPerm :: Permutable repr => Permutation repr k k
- Symantic.Base.Permutable: optionalPerm :: (Permutable repr, Eitherable repr) => Dimapable repr => Permutable repr => repr (a -> k) k -> Permutation repr (Maybe a -> k) k
- Symantic.Base.Permutable: perm :: Permutable repr => repr (a -> k) k -> Permutation repr (a -> k) k
- Symantic.Base.Permutable: permWithDefault :: Permutable repr => a -> repr (a -> k) k -> Permutation repr (a -> k) k
- Symantic.Base.Permutable: permutable :: Permutable repr => Permutation repr (a -> k) k -> repr (a -> k) k
- Symantic.Base.Permutable: type Permutation repr = Permutation (UnTrans repr);
- Symantic.Base.Permutable: type family Permutation (repr :: * -> * -> *) = (r :: * -> * -> *) | r -> repr;
- Symantic.Base.Permutable: }
- Symantic.Base.Routable: (:!:) :: a -> b -> (:!:) a b
- Symantic.Base.Routable: (<!>) :: Routable repr => repr a k -> repr b k -> repr (a :!: b) k
- Symantic.Base.Routable: class Routable repr
- Symantic.Base.Routable: data (:!:) a b
- Symantic.Base.Routable: infixr 3 :!:
- Symantic.Base.Routable: instance (GHC.Classes.Eq a, GHC.Classes.Eq b) => GHC.Classes.Eq (a Symantic.Base.Routable.:!: b)
- Symantic.Base.Routable: instance (GHC.Show.Show a, GHC.Show.Show b) => GHC.Show.Show (a Symantic.Base.Routable.:!: b)
+ Symantic.Dityped.ADT: adtOfeot :: Generic a => RepOfEoT a => EoT (ADT a) -> a
+ Symantic.Dityped.ADT: class EithersOfRep (a :: * -> *) ss
+ Symantic.Dityped.ADT: class FieldOfRep (a :: * -> *)
+ Symantic.Dityped.ADT: class RepOfEithers (a :: * -> *) ss
+ Symantic.Dityped.ADT: class RepOfField (a :: * -> *)
+ Symantic.Dityped.ADT: class RepOfTuples (a :: * -> *) (xs :: [*])
+ Symantic.Dityped.ADT: class TuplesOfRep (a :: * -> *) (ps :: [*])
+ Symantic.Dityped.ADT: eithersOfRepL :: EithersOfRep a ss => a x -> EoT (ListOfRepSums a ss)
+ Symantic.Dityped.ADT: eithersOfRepR :: EithersOfRep a ss => EoT ss -> EoT (ListOfRepSums a ss)
+ Symantic.Dityped.ADT: eotOfadt :: Generic a => EoTOfRep a => a -> EoT (ADT a)
+ Symantic.Dityped.ADT: fieldOfRep :: FieldOfRep a => a x -> TypeOfRepField a
+ Symantic.Dityped.ADT: instance (Symantic.Dityped.ADT.EithersOfRep a (Symantic.Dityped.ADT.ListOfRepSums b ss), Symantic.Dityped.ADT.EithersOfRep b ss) => Symantic.Dityped.ADT.EithersOfRep (a GHC.Generics.:+: b) ss
+ Symantic.Dityped.ADT: instance (Symantic.Dityped.ADT.RepOfEithers a (Symantic.Dityped.ADT.ListOfRepSums b ss), Symantic.Dityped.ADT.RepOfEithers b ss) => Symantic.Dityped.ADT.RepOfEithers (a GHC.Generics.:+: b) ss
+ Symantic.Dityped.ADT: instance (Symantic.Dityped.ADT.RepOfTuples a (Symantic.Dityped.ADT.ListOfRepProducts b ps), Symantic.Dityped.ADT.RepOfTuples b ps) => Symantic.Dityped.ADT.RepOfTuples (a GHC.Generics.:*: b) ps
+ Symantic.Dityped.ADT: instance (Symantic.Dityped.ADT.TuplesOfRep a (Symantic.Dityped.ADT.ListOfRepProducts b ps), Symantic.Dityped.ADT.TuplesOfRep b ps) => Symantic.Dityped.ADT.TuplesOfRep (a GHC.Generics.:*: b) ps
+ Symantic.Dityped.ADT: instance Symantic.Dityped.ADT.EithersOfRep GHC.Generics.V1 ss
+ Symantic.Dityped.ADT: instance Symantic.Dityped.ADT.EithersOfRep a ss => Symantic.Dityped.ADT.EithersOfRep (GHC.Generics.M1 GHC.Generics.D c a) ss
+ Symantic.Dityped.ADT: instance Symantic.Dityped.ADT.FieldOfRep (GHC.Generics.K1 i a)
+ Symantic.Dityped.ADT: instance Symantic.Dityped.ADT.FieldOfRep a => Symantic.Dityped.ADT.TuplesOfRep (GHC.Generics.M1 GHC.Generics.S c a) '[]
+ Symantic.Dityped.ADT: instance Symantic.Dityped.ADT.FieldOfRep a => Symantic.Dityped.ADT.TuplesOfRep (GHC.Generics.M1 GHC.Generics.S c a) (x : ps)
+ Symantic.Dityped.ADT: instance Symantic.Dityped.ADT.RepOfEithers GHC.Generics.V1 ss
+ Symantic.Dityped.ADT: instance Symantic.Dityped.ADT.RepOfEithers a ss => Symantic.Dityped.ADT.RepOfEithers (GHC.Generics.M1 GHC.Generics.D c a) ss
+ Symantic.Dityped.ADT: instance Symantic.Dityped.ADT.RepOfField (GHC.Generics.K1 i a)
+ Symantic.Dityped.ADT: instance Symantic.Dityped.ADT.RepOfField a => Symantic.Dityped.ADT.RepOfTuples (GHC.Generics.M1 GHC.Generics.S c a) '[]
+ Symantic.Dityped.ADT: instance Symantic.Dityped.ADT.RepOfField a => Symantic.Dityped.ADT.RepOfTuples (GHC.Generics.M1 GHC.Generics.S c a) (p : ps)
+ Symantic.Dityped.ADT: instance Symantic.Dityped.ADT.RepOfTuples GHC.Generics.U1 ps
+ Symantic.Dityped.ADT: instance Symantic.Dityped.ADT.RepOfTuples a '[] => Symantic.Dityped.ADT.RepOfEithers (GHC.Generics.M1 GHC.Generics.C c a) '[]
+ Symantic.Dityped.ADT: instance Symantic.Dityped.ADT.RepOfTuples a '[] => Symantic.Dityped.ADT.RepOfEithers (GHC.Generics.M1 GHC.Generics.C c a) (ps : ss)
+ Symantic.Dityped.ADT: instance Symantic.Dityped.ADT.TuplesOfRep GHC.Generics.U1 ps
+ Symantic.Dityped.ADT: instance Symantic.Dityped.ADT.TuplesOfRep a '[] => Symantic.Dityped.ADT.EithersOfRep (GHC.Generics.M1 GHC.Generics.C c a) '[]
+ Symantic.Dityped.ADT: instance Symantic.Dityped.ADT.TuplesOfRep a '[] => Symantic.Dityped.ADT.EithersOfRep (GHC.Generics.M1 GHC.Generics.C c a) (ps : ss)
+ Symantic.Dityped.ADT: repOfEithers :: RepOfEithers a ss => EoT (ListOfRepSums a ss) -> (a x -> r) -> (EoT ss -> r) -> r
+ Symantic.Dityped.ADT: repOfField :: RepOfField a => TypeOfRepField a -> a x
+ Symantic.Dityped.ADT: repOfTuples :: RepOfTuples a xs => Tuples (ListOfRepProducts a xs) -> (a x -> Tuples xs -> r) -> r
+ Symantic.Dityped.ADT: tuplesOfRep :: TuplesOfRep a ps => a x -> Tuples ps -> Tuples (ListOfRepProducts a ps)
+ Symantic.Dityped.ADT: type ADT (adt :: *) = ListOfRepSums (Rep adt) '[]
+ Symantic.Dityped.ADT: type EoTOfRep a = EithersOfRep (Rep a) '[]
+ Symantic.Dityped.ADT: type RepOfEoT a = RepOfEithers (Rep a) '[]
+ Symantic.Dityped.ADT: type family TypeOfRepField (a :: * -> *) :: *
+ Symantic.Dityped.CurryN: class CurryN args
+ Symantic.Dityped.CurryN: curryN :: CurryN args => (Tuples args -> res) -> args -..-> res
+ Symantic.Dityped.CurryN: instance Symantic.Dityped.CurryN.CurryN '[a]
+ Symantic.Dityped.CurryN: instance Symantic.Dityped.CurryN.CurryN (b : as) => Symantic.Dityped.CurryN.CurryN (a : b : as)
+ Symantic.Dityped.CurryN: mapresultN :: CurryN args => (a -> b) -> (args -..-> a) -> args -..-> b
+ Symantic.Dityped.CurryN: type family Result (as :: *) :: *
+ Symantic.Dityped.CurryN: uncurryN :: CurryN args => (args -..-> res) -> Tuples args -> res
+ Symantic.Dityped.Derive: class Derivable repr
+ Symantic.Dityped.Derive: class LiftDerived repr
+ Symantic.Dityped.Derive: class LiftDerived1 repr
+ Symantic.Dityped.Derive: class LiftDerived2 repr
+ Symantic.Dityped.Derive: class LiftDerived3 repr
+ Symantic.Dityped.Derive: class LiftDerived4 repr
+ Symantic.Dityped.Derive: derive :: Derivable repr => repr a ka -> Derived repr a ka
+ Symantic.Dityped.Derive: liftDerived :: LiftDerived repr => Derived repr a ka -> repr a ka
+ Symantic.Dityped.Derive: liftDerived1 :: (LiftDerived1 repr, LiftDerived repr) => Derivable repr => (Derived repr a ka -> Derived repr b kb) -> repr a ka -> repr b kb
+ Symantic.Dityped.Derive: liftDerived2 :: (LiftDerived2 repr, LiftDerived repr) => Derivable repr => (Derived repr a ka -> Derived repr b kb -> Derived repr c kc) -> repr a ka -> repr b kb -> repr c kc
+ Symantic.Dityped.Derive: liftDerived3 :: (LiftDerived3 repr, LiftDerived repr) => Derivable repr => (Derived repr a ka -> Derived repr b kb -> Derived repr c kc -> Derived repr d kd) -> repr a ka -> repr b kb -> repr c kc -> repr d kd
+ Symantic.Dityped.Derive: liftDerived4 :: (LiftDerived4 repr, LiftDerived repr) => Derivable repr => (Derived repr a ka -> Derived repr b kb -> Derived repr c kc -> Derived repr d kd -> Derived repr e ke) -> repr a ka -> repr b kb -> repr c kc -> repr d kd -> repr e ke
+ Symantic.Dityped.Derive: type FromDerived sym repr = (LiftDerived repr, sym (Derived repr))
+ Symantic.Dityped.Derive: type FromDerived1 sym repr = (LiftDerived1 repr, sym (Derived repr))
+ Symantic.Dityped.Derive: type FromDerived2 sym repr = (LiftDerived2 repr, sym (Derived repr))
+ Symantic.Dityped.Derive: type FromDerived3 sym repr = (LiftDerived3 repr, sym (Derived repr))
+ Symantic.Dityped.Derive: type FromDerived4 sym repr = (LiftDerived4 repr, sym (Derived repr))
+ Symantic.Dityped.Derive: type family Derived (repr :: Type -> Type -> Type) :: Type -> Type -> Type
+ Symantic.Dityped.Lang: (:!:) :: a -> b -> (:!:) a b
+ Symantic.Dityped.Lang: (<!>) :: (Routable repr, FromDerived2 Routable repr) => repr a k -> repr b k -> repr (a :!: b) k
+ Symantic.Dityped.Lang: (<&>) :: Permutable repr => Tupable (Permutation repr) => repr (a -> k) k -> Permutation repr (b -> k) k -> Permutation repr ((a, b) -> k) k
+ Symantic.Dityped.Lang: (<*&>) :: Eitherable repr => Repeatable repr => Dimapable repr => Permutable repr => Tupable (Permutation repr) => repr (a -> k) k -> Permutation repr (b -> k) k -> Permutation repr (([a], b) -> k) k
+ Symantic.Dityped.Lang: (<+&>) :: Eitherable repr => Repeatable repr => Dimapable repr => Permutable repr => Tupable (Permutation repr) => repr (a -> k) k -> Permutation repr (b -> k) k -> Permutation repr (([a], b) -> k) k
+ Symantic.Dityped.Lang: (<+>) :: (Eitherable repr, FromDerived2 Eitherable repr) => repr (a -> k) k -> repr (b -> k) k -> repr (Either a b -> k) k
+ Symantic.Dityped.Lang: (<->) :: (Substractable repr, FromDerived2 Substractable repr) => repr a k -> repr k' k' -> repr a k
+ Symantic.Dityped.Lang: (<.>) :: (Composable repr, FromDerived2 Composable repr) => repr a b -> repr b c -> repr a c
+ Symantic.Dityped.Lang: (<:>) :: (Tupable repr, FromDerived2 Tupable repr) => repr (a -> k) k -> repr (b -> k) k -> repr ((a, b) -> k) k
+ Symantic.Dityped.Lang: (<?&>) :: Eitherable repr => Dimapable repr => Permutable repr => Tupable (Permutation repr) => repr (a -> k) k -> Permutation repr (b -> k) k -> Permutation repr ((Maybe a, b) -> k) k
+ Symantic.Dityped.Lang: adt :: forall adt repr k. Dimapable repr => Generic adt => RepOfEoT adt => EoTOfRep adt => repr (EoT (ADT adt) -> k) k -> repr (adt -> k) k
+ Symantic.Dityped.Lang: class Composable repr
+ Symantic.Dityped.Lang: class Constant repr
+ Symantic.Dityped.Lang: class Dicurryable repr
+ Symantic.Dityped.Lang: class Dimapable repr
+ Symantic.Dityped.Lang: class Eitherable repr
+ Symantic.Dityped.Lang: class Emptyable repr
+ Symantic.Dityped.Lang: class Optionable repr
+ Symantic.Dityped.Lang: class Permutable repr where {
+ Symantic.Dityped.Lang: class Repeatable repr
+ Symantic.Dityped.Lang: class Routable repr
+ Symantic.Dityped.Lang: class Substractable repr
+ Symantic.Dityped.Lang: class Tupable repr
+ Symantic.Dityped.Lang: class Unitable repr
+ Symantic.Dityped.Lang: class Voidable repr
+ Symantic.Dityped.Lang: constant :: (Constant repr, FromDerived Constant repr) => a -> repr (a -> k) k
+ Symantic.Dityped.Lang: construct :: forall args a k repr. Dicurryable repr => Generic a => EoTOfRep a => CurryN args => Tuples args ~ EoT (ADT a) => args ~ Args (args -..-> a) => (args -..-> a) -> repr (args -..-> k) k -> repr (a -> k) k
+ Symantic.Dityped.Lang: data (:!:) a b
+ Symantic.Dityped.Lang: dicurry :: (Dicurryable repr, FromDerived1 Dicurryable repr) => CurryN args => proxy args -> (args -..-> r) -> (r -> Tuples args) -> repr (args -..-> k) k -> repr (r -> k) k
+ Symantic.Dityped.Lang: dimap :: (Dimapable repr, FromDerived1 Dimapable repr) => (a -> b) -> (b -> a) -> repr (a -> k) k -> repr (b -> k) k
+ Symantic.Dityped.Lang: empty :: (Emptyable repr, FromDerived Emptyable repr) => repr k k
+ Symantic.Dityped.Lang: infixr 3 <->
+ Symantic.Dityped.Lang: infixr 4 <:>
+ Symantic.Dityped.Lang: instance (GHC.Classes.Eq a, GHC.Classes.Eq b) => GHC.Classes.Eq (a Symantic.Dityped.Lang.:!: b)
+ Symantic.Dityped.Lang: instance (GHC.Show.Show a, GHC.Show.Show b) => GHC.Show.Show (a Symantic.Dityped.Lang.:!: b)
+ Symantic.Dityped.Lang: many0 :: (Repeatable repr, FromDerived1 Repeatable repr) => repr (a -> k) k -> repr ([a] -> k) k
+ Symantic.Dityped.Lang: many1 :: (Repeatable repr, FromDerived1 Repeatable repr) => repr (a -> k) k -> repr ([a] -> k) k
+ Symantic.Dityped.Lang: noPerm :: Permutable repr => Permutation repr k k
+ Symantic.Dityped.Lang: option :: (Optionable repr, FromDerived1 Optionable repr) => repr k k -> repr k k
+ Symantic.Dityped.Lang: optional :: (Optionable repr, FromDerived1 Optionable repr) => repr (a -> k) k -> repr (Maybe a -> k) k
+ Symantic.Dityped.Lang: optionalPerm :: (Permutable repr, Eitherable repr) => Dimapable repr => Permutable repr => repr (a -> k) k -> Permutation repr (Maybe a -> k) k
+ Symantic.Dityped.Lang: perm :: Permutable repr => repr (a -> k) k -> Permutation repr (a -> k) k
+ Symantic.Dityped.Lang: permWithDefault :: Permutable repr => a -> repr (a -> k) k -> Permutation repr (a -> k) k
+ Symantic.Dityped.Lang: permutable :: Permutable repr => Permutation repr (a -> k) k -> repr (a -> k) k
+ Symantic.Dityped.Lang: type Permutation repr = Permutation (Derived repr);
+ Symantic.Dityped.Lang: type family Permutation (repr :: * -> * -> *) = (r :: * -> * -> *) | r -> repr;
+ Symantic.Dityped.Lang: unit :: (Unitable repr, FromDerived Unitable repr) => repr (() -> k) k
+ Symantic.Dityped.Lang: void :: Voidable repr => a -> repr (a -> b) k -> repr b k
+ Symantic.Dityped.Lang: }
+ Symantic.Typed.Data: SomeData :: Data able repr a -> SomeData repr a
+ Symantic.Typed.Data: data SomeData repr a
+ Symantic.Typed.Data: data family Data (able :: TypedRepr -> Constraint) :: TypedRepr -> TypedRepr
+ Symantic.Typed.Data: infixr 4 `Cons`
+ Symantic.Typed.Data: instance (Symantic.Typed.Lang.Constantable c repr, Data.Typeable.Internal.Typeable c) => Symantic.Typed.Lang.Constantable c (Symantic.Typed.Data.SomeData repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Derive.Derivable (Symantic.Typed.Data.SomeData repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Abstractable repr => Symantic.Typed.Derive.Derivable (Symantic.Typed.Data.Data Symantic.Typed.Lang.Abstractable repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Abstractable repr => Symantic.Typed.Lang.Abstractable (Symantic.Typed.Data.SomeData repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Anythingable (Symantic.Typed.Data.Data Symantic.Typed.Lang.Anythingable repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Anythingable (Symantic.Typed.Data.SomeData repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Anythingable repr => Symantic.Typed.Derive.Derivable (Symantic.Typed.Data.Data Symantic.Typed.Lang.Anythingable repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Bottomable repr => Symantic.Typed.Derive.Derivable (Symantic.Typed.Data.Data Symantic.Typed.Lang.Bottomable repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Constantable c (Symantic.Typed.Data.Data (Symantic.Typed.Lang.Constantable c) repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Constantable c repr => Symantic.Typed.Derive.Derivable (Symantic.Typed.Data.Data (Symantic.Typed.Lang.Constantable c) repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Eitherable (Symantic.Typed.Data.Data Symantic.Typed.Lang.Eitherable repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Eitherable repr => Symantic.Typed.Derive.Derivable (Symantic.Typed.Data.Data Symantic.Typed.Lang.Eitherable repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Eitherable repr => Symantic.Typed.Lang.Eitherable (Symantic.Typed.Data.SomeData repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Equalable (Symantic.Typed.Data.Data Symantic.Typed.Lang.Equalable repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Equalable repr => Symantic.Typed.Derive.Derivable (Symantic.Typed.Data.Data Symantic.Typed.Lang.Equalable repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Equalable repr => Symantic.Typed.Lang.Equalable (Symantic.Typed.Data.SomeData repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.IfThenElseable repr => Symantic.Typed.Derive.Derivable (Symantic.Typed.Data.Data Symantic.Typed.Lang.IfThenElseable repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.IfThenElseable repr => Symantic.Typed.Lang.IfThenElseable (Symantic.Typed.Data.Data Symantic.Typed.Lang.IfThenElseable repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.IfThenElseable repr => Symantic.Typed.Lang.IfThenElseable (Symantic.Typed.Data.SomeData repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Listable (Symantic.Typed.Data.Data Symantic.Typed.Lang.Listable repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Listable repr => Symantic.Typed.Derive.Derivable (Symantic.Typed.Data.Data Symantic.Typed.Lang.Listable repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Listable repr => Symantic.Typed.Lang.Listable (Symantic.Typed.Data.SomeData repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Maybeable (Symantic.Typed.Data.Data Symantic.Typed.Lang.Maybeable repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Maybeable repr => Symantic.Typed.Derive.Derivable (Symantic.Typed.Data.Data Symantic.Typed.Lang.Maybeable repr)
+ Symantic.Typed.Data: instance Symantic.Typed.Lang.Maybeable repr => Symantic.Typed.Lang.Maybeable (Symantic.Typed.Data.SomeData repr)
+ Symantic.Typed.Data: pattern Data :: Typeable able => Data able repr a -> SomeData repr a
+ Symantic.Typed.Data: type TypedRepr = Type -> Type
+ Symantic.Typed.Data: unSomeData :: forall able repr a. Typeable able => SomeData repr a -> Maybe (Data able repr a)
+ Symantic.Typed.Derive: class Derivable repr
+ Symantic.Typed.Derive: class LiftDerived repr
+ Symantic.Typed.Derive: class LiftDerived1 repr
+ Symantic.Typed.Derive: class LiftDerived2 repr
+ Symantic.Typed.Derive: class LiftDerived3 repr
+ Symantic.Typed.Derive: class LiftDerived4 repr
+ Symantic.Typed.Derive: derive :: Derivable repr => repr a -> Derived repr a
+ Symantic.Typed.Derive: liftDerived :: LiftDerived repr => Derived repr a -> repr a
+ Symantic.Typed.Derive: liftDerived1 :: (LiftDerived1 repr, LiftDerived repr) => Derivable repr => (Derived repr a -> Derived repr b) -> repr a -> repr b
+ Symantic.Typed.Derive: liftDerived2 :: (LiftDerived2 repr, LiftDerived repr) => Derivable repr => (Derived repr a -> Derived repr b -> Derived repr c) -> repr a -> repr b -> repr c
+ Symantic.Typed.Derive: liftDerived3 :: (LiftDerived3 repr, LiftDerived repr) => Derivable repr => (Derived repr a -> Derived repr b -> Derived repr c -> Derived repr d) -> repr a -> repr b -> repr c -> repr d
+ Symantic.Typed.Derive: liftDerived4 :: (LiftDerived4 repr, LiftDerived repr) => Derivable repr => (Derived repr a -> Derived repr b -> Derived repr c -> Derived repr d -> Derived repr e) -> repr a -> repr b -> repr c -> repr d -> repr e
+ Symantic.Typed.Derive: type FromDerived sym repr = (LiftDerived repr, sym (Derived repr))
+ Symantic.Typed.Derive: type FromDerived1 sym repr = (LiftDerived1 repr, sym (Derived repr))
+ Symantic.Typed.Derive: type FromDerived2 sym repr = (LiftDerived2 repr, sym (Derived repr))
+ Symantic.Typed.Derive: type FromDerived3 sym repr = (LiftDerived3 repr, sym (Derived repr))
+ Symantic.Typed.Derive: type FromDerived4 sym repr = (LiftDerived4 repr, sym (Derived repr))
+ Symantic.Typed.Derive: type family Derived (repr :: Type -> Type) :: Type -> Type
+ Symantic.Typed.Fixity: AssocB :: Side -> Associativity
+ Symantic.Typed.Fixity: AssocL :: Associativity
+ Symantic.Typed.Fixity: AssocR :: Associativity
+ Symantic.Typed.Fixity: Fixity1 :: Unifix -> Fixity
+ Symantic.Typed.Fixity: Fixity2 :: Infix -> Fixity
+ Symantic.Typed.Fixity: Infix :: Maybe Associativity -> Precedence -> Infix
+ Symantic.Typed.Fixity: Postfix :: Precedence -> Unifix
+ Symantic.Typed.Fixity: Prefix :: Precedence -> Unifix
+ Symantic.Typed.Fixity: SideL :: Side
+ Symantic.Typed.Fixity: SideR :: Side
+ Symantic.Typed.Fixity: [infix_associativity] :: Infix -> Maybe Associativity
+ Symantic.Typed.Fixity: [infix_precedence] :: Infix -> Precedence
+ Symantic.Typed.Fixity: [unifix_precedence] :: Unifix -> Precedence
+ Symantic.Typed.Fixity: class PrecedenceOf a
+ Symantic.Typed.Fixity: data Associativity
+ Symantic.Typed.Fixity: data Fixity
+ Symantic.Typed.Fixity: data Infix
+ Symantic.Typed.Fixity: data Side
+ Symantic.Typed.Fixity: data Unifix
+ Symantic.Typed.Fixity: infixB :: Side -> Precedence -> Infix
+ Symantic.Typed.Fixity: infixL :: Precedence -> Infix
+ Symantic.Typed.Fixity: infixN :: Precedence -> Infix
+ Symantic.Typed.Fixity: infixN0 :: Infix
+ Symantic.Typed.Fixity: infixN5 :: Infix
+ Symantic.Typed.Fixity: infixR :: Precedence -> Infix
+ Symantic.Typed.Fixity: instance GHC.Classes.Eq Symantic.Typed.Fixity.Associativity
+ Symantic.Typed.Fixity: instance GHC.Classes.Eq Symantic.Typed.Fixity.Fixity
+ Symantic.Typed.Fixity: instance GHC.Classes.Eq Symantic.Typed.Fixity.Infix
+ Symantic.Typed.Fixity: instance GHC.Classes.Eq Symantic.Typed.Fixity.Side
+ Symantic.Typed.Fixity: instance GHC.Classes.Eq Symantic.Typed.Fixity.Unifix
+ Symantic.Typed.Fixity: instance GHC.Show.Show Symantic.Typed.Fixity.Associativity
+ Symantic.Typed.Fixity: instance GHC.Show.Show Symantic.Typed.Fixity.Fixity
+ Symantic.Typed.Fixity: instance GHC.Show.Show Symantic.Typed.Fixity.Infix
+ Symantic.Typed.Fixity: instance GHC.Show.Show Symantic.Typed.Fixity.Side
+ Symantic.Typed.Fixity: instance GHC.Show.Show Symantic.Typed.Fixity.Unifix
+ Symantic.Typed.Fixity: instance Symantic.Typed.Fixity.PrecedenceOf Symantic.Typed.Fixity.Fixity
+ Symantic.Typed.Fixity: instance Symantic.Typed.Fixity.PrecedenceOf Symantic.Typed.Fixity.Infix
+ Symantic.Typed.Fixity: instance Symantic.Typed.Fixity.PrecedenceOf Symantic.Typed.Fixity.Unifix
+ Symantic.Typed.Fixity: isPairNeeded :: (Infix, Side) -> Infix -> Bool
+ Symantic.Typed.Fixity: pairAngle :: Pair
+ Symantic.Typed.Fixity: pairBrace :: Pair
+ Symantic.Typed.Fixity: pairBracket :: Pair
+ Symantic.Typed.Fixity: pairIfNeeded :: Semigroup s => IsString s => Pair -> (Infix, Side) -> Infix -> s -> s
+ Symantic.Typed.Fixity: pairParen :: Pair
+ Symantic.Typed.Fixity: precedence :: PrecedenceOf a => a -> Precedence
+ Symantic.Typed.Fixity: type Pair = (String, String)
+ Symantic.Typed.Fixity: type Precedence = Int
+ Symantic.Typed.Lang: ($) :: (Abstractable repr, FromDerived Abstractable repr) => repr ((a -> b) -> a -> b)
+ Symantic.Typed.Lang: (.) :: (Abstractable repr, FromDerived Abstractable repr) => repr ((b -> c) -> (a -> b) -> a -> c)
+ Symantic.Typed.Lang: (.@) :: (Abstractable repr, FromDerived2 Abstractable repr) => repr (a -> b) -> repr a -> repr b
+ Symantic.Typed.Lang: (==) :: (Abstractable repr, Equalable repr, Eq a) => repr (a -> a -> Bool)
+ Symantic.Typed.Lang: anything :: Anythingable repr => repr a -> repr a
+ Symantic.Typed.Lang: bool :: Constantable Bool repr => Bool -> repr Bool
+ Symantic.Typed.Lang: bottom :: Bottomable repr => repr a
+ Symantic.Typed.Lang: char :: Constantable Char repr => Char -> repr Char
+ Symantic.Typed.Lang: class Abstractable repr
+ Symantic.Typed.Lang: class Anythingable repr
+ Symantic.Typed.Lang: class Bottomable repr
+ Symantic.Typed.Lang: class Constantable c repr
+ Symantic.Typed.Lang: class Eitherable repr
+ Symantic.Typed.Lang: class Equalable repr
+ Symantic.Typed.Lang: class IfThenElseable repr
+ Symantic.Typed.Lang: class Listable repr
+ Symantic.Typed.Lang: class Maybeable repr
+ Symantic.Typed.Lang: cons :: (Listable repr, FromDerived Listable repr) => repr (a -> [a] -> [a])
+ Symantic.Typed.Lang: const :: (Abstractable repr, FromDerived Abstractable repr) => repr (a -> b -> a)
+ Symantic.Typed.Lang: constant :: (Constantable c repr, FromDerived (Constantable c) repr) => c -> repr c
+ Symantic.Typed.Lang: equal :: (Equalable repr, FromDerived Equalable repr) => Eq a => repr (a -> a -> Bool)
+ Symantic.Typed.Lang: flip :: (Abstractable repr, FromDerived Abstractable repr) => repr ((a -> b -> c) -> b -> a -> c)
+ Symantic.Typed.Lang: id :: (Abstractable repr, FromDerived Abstractable repr) => repr (a -> a)
+ Symantic.Typed.Lang: ifThenElse :: (IfThenElseable repr, FromDerived3 IfThenElseable repr) => repr Bool -> repr a -> repr a -> repr a
+ Symantic.Typed.Lang: infix 4 ==
+ Symantic.Typed.Lang: infixl 9 .@
+ Symantic.Typed.Lang: infixr 0 $
+ Symantic.Typed.Lang: infixr 9 .
+ Symantic.Typed.Lang: just :: (Maybeable repr, FromDerived Maybeable repr) => repr (a -> Maybe a)
+ Symantic.Typed.Lang: lam :: (Abstractable repr, FromDerived Abstractable repr) => Derivable repr => (repr a -> repr b) -> repr (a -> b)
+ Symantic.Typed.Lang: lam1 :: (Abstractable repr, FromDerived Abstractable repr) => Derivable repr => (repr a -> repr b) -> repr (a -> b)
+ Symantic.Typed.Lang: left :: (Eitherable repr, FromDerived Eitherable repr) => repr (l -> Either l r)
+ Symantic.Typed.Lang: nil :: (Listable repr, FromDerived Listable repr) => repr [a]
+ Symantic.Typed.Lang: nothing :: (Maybeable repr, FromDerived Maybeable repr) => repr (Maybe a)
+ Symantic.Typed.Lang: right :: (Eitherable repr, FromDerived Eitherable repr) => repr (r -> Either l r)
+ Symantic.Typed.Lang: unit :: Constantable () repr => repr ()
+ Symantic.Typed.Lang: var :: (Abstractable repr, FromDerived1 Abstractable repr) => repr a -> repr a
+ Symantic.Typed.ObserveSharing: FinalizeSharing :: ReaderT (HashSet letName) (Writer (LetBindings letName repr)) (repr a) -> FinalizeSharing letName repr a
+ Symantic.Typed.ObserveSharing: ObserveSharing :: ReaderT (HashSet SharingName) (State (ObserveSharingState letName)) (FinalizeSharing letName repr a) -> ObserveSharing letName repr a
+ Symantic.Typed.ObserveSharing: ObserveSharingState :: HashMap SharingName (letName, Int) -> HashSet SharingName -> ObserveSharingState letName
+ Symantic.Typed.ObserveSharing: SharingName :: StableName a -> SharingName
+ Symantic.Typed.ObserveSharing: SomeLet :: repr a -> SomeLet repr
+ Symantic.Typed.ObserveSharing: [oss_recs] :: ObserveSharingState letName -> HashSet SharingName
+ Symantic.Typed.ObserveSharing: [oss_refs] :: ObserveSharingState letName -> HashMap SharingName (letName, Int)
+ Symantic.Typed.ObserveSharing: [unFinalizeSharing] :: FinalizeSharing letName repr a -> ReaderT (HashSet letName) (Writer (LetBindings letName repr)) (repr a)
+ Symantic.Typed.ObserveSharing: [unObserveSharing] :: ObserveSharing letName repr a -> ReaderT (HashSet SharingName) (State (ObserveSharingState letName)) (FinalizeSharing letName repr a)
+ Symantic.Typed.ObserveSharing: class Letable letName repr
+ Symantic.Typed.ObserveSharing: class Letsable letName repr
+ Symantic.Typed.ObserveSharing: class MakeLetName letName
+ Symantic.Typed.ObserveSharing: class ShowLetName (showName :: Bool) letName
+ Symantic.Typed.ObserveSharing: data ObserveSharingState letName
+ Symantic.Typed.ObserveSharing: data SharingName
+ Symantic.Typed.ObserveSharing: data SomeLet repr
+ Symantic.Typed.ObserveSharing: instance (GHC.Classes.Eq letName, Data.Hashable.Class.Hashable letName) => Symantic.Typed.Derive.LiftDerived (Symantic.Typed.ObserveSharing.FinalizeSharing letName repr)
+ Symantic.Typed.ObserveSharing: instance (GHC.Classes.Eq letName, Data.Hashable.Class.Hashable letName) => Symantic.Typed.Derive.LiftDerived1 (Symantic.Typed.ObserveSharing.FinalizeSharing letName repr)
+ Symantic.Typed.ObserveSharing: instance (GHC.Classes.Eq letName, Data.Hashable.Class.Hashable letName) => Symantic.Typed.Derive.LiftDerived2 (Symantic.Typed.ObserveSharing.FinalizeSharing letName repr)
+ Symantic.Typed.ObserveSharing: instance (GHC.Classes.Eq letName, Data.Hashable.Class.Hashable letName) => Symantic.Typed.Derive.LiftDerived3 (Symantic.Typed.ObserveSharing.FinalizeSharing letName repr)
+ Symantic.Typed.ObserveSharing: instance (Symantic.Typed.ObserveSharing.Letable letName repr, GHC.Classes.Eq letName, Data.Hashable.Class.Hashable letName, GHC.Show.Show letName) => Symantic.Typed.ObserveSharing.Letable letName (Symantic.Typed.ObserveSharing.FinalizeSharing letName repr)
+ Symantic.Typed.ObserveSharing: instance (Symantic.Typed.ObserveSharing.Letable letName repr, Symantic.Typed.ObserveSharing.MakeLetName letName, GHC.Classes.Eq letName, Data.Hashable.Class.Hashable letName, GHC.Show.Show letName) => Symantic.Typed.Derive.LiftDerived (Symantic.Typed.ObserveSharing.ObserveSharing letName repr)
+ Symantic.Typed.ObserveSharing: instance (Symantic.Typed.ObserveSharing.Letable letName repr, Symantic.Typed.ObserveSharing.MakeLetName letName, GHC.Classes.Eq letName, Data.Hashable.Class.Hashable letName, GHC.Show.Show letName) => Symantic.Typed.Derive.LiftDerived1 (Symantic.Typed.ObserveSharing.ObserveSharing letName repr)
+ Symantic.Typed.ObserveSharing: instance (Symantic.Typed.ObserveSharing.Letable letName repr, Symantic.Typed.ObserveSharing.MakeLetName letName, GHC.Classes.Eq letName, Data.Hashable.Class.Hashable letName, GHC.Show.Show letName) => Symantic.Typed.Derive.LiftDerived2 (Symantic.Typed.ObserveSharing.ObserveSharing letName repr)
+ Symantic.Typed.ObserveSharing: instance (Symantic.Typed.ObserveSharing.Letable letName repr, Symantic.Typed.ObserveSharing.MakeLetName letName, GHC.Classes.Eq letName, Data.Hashable.Class.Hashable letName, GHC.Show.Show letName) => Symantic.Typed.Derive.LiftDerived3 (Symantic.Typed.ObserveSharing.ObserveSharing letName repr)
+ Symantic.Typed.ObserveSharing: instance Data.Hashable.Class.Hashable Symantic.Typed.ObserveSharing.SharingName
+ Symantic.Typed.ObserveSharing: instance GHC.Classes.Eq Symantic.Typed.ObserveSharing.SharingName
+ Symantic.Typed.ObserveSharing: instance GHC.Show.Show letName => Symantic.Typed.ObserveSharing.ShowLetName 'GHC.Types.True letName
+ Symantic.Typed.ObserveSharing: instance Symantic.Typed.ObserveSharing.Letable letName (Symantic.Typed.ObserveSharing.ObserveSharing letName repr)
+ Symantic.Typed.ObserveSharing: instance Symantic.Typed.ObserveSharing.Letsable letName (Symantic.Typed.ObserveSharing.ObserveSharing letName repr)
+ Symantic.Typed.ObserveSharing: instance Symantic.Typed.ObserveSharing.ShowLetName 'GHC.Types.False letName
+ Symantic.Typed.ObserveSharing: lets :: (Letsable letName repr, Derivable repr) => FromDerived1 (Letsable letName) repr => LetBindings letName repr -> repr a -> repr a
+ Symantic.Typed.ObserveSharing: makeLetName :: MakeLetName letName => SharingName -> IO letName
+ Symantic.Typed.ObserveSharing: makeSharingName :: a -> SharingName
+ Symantic.Typed.ObserveSharing: newtype FinalizeSharing letName repr a
+ Symantic.Typed.ObserveSharing: newtype ObserveSharing letName repr a
+ Symantic.Typed.ObserveSharing: observeSharing :: Eq letName => Hashable letName => Show letName => ObserveSharing letName repr a -> WithSharing letName repr a
+ Symantic.Typed.ObserveSharing: observeSharingNode :: Eq letName => Hashable letName => Show letName => Letable letName repr => MakeLetName letName => ObserveSharing letName repr a -> ObserveSharing letName repr a
+ Symantic.Typed.ObserveSharing: ref :: (Letable letName repr, FromDerived (Letable letName) repr) => Bool -> letName -> repr a
+ Symantic.Typed.ObserveSharing: shareable :: (Letable letName repr, FromDerived1 (Letable letName) repr) => letName -> repr a -> repr a
+ Symantic.Typed.ObserveSharing: showLetName :: ShowLetName showName letName => letName -> String
+ Symantic.Typed.ObserveSharing: type LetBindings letName repr = HashMap letName (SomeLet repr)
+ Symantic.Typed.ObserveSharing: type WithSharing letName repr a = (repr a, HashMap letName (SomeLet repr))
+ Symantic.Typed.Optimize: normalOrderReduction :: forall repr a. Abstractable repr => IfThenElseable repr => SomeData repr a -> SomeData repr a
+ Symantic.Typed.Reify: (-->) :: Abstractable repr => ReifyReflect repr m1 o1 -> ReifyReflect repr m2 o2 -> ReifyReflect repr (m1 -> m2) (o1 -> o2)
+ Symantic.Typed.Reify: ReifyReflect :: (meta -> repr a) -> (repr a -> meta) -> ReifyReflect repr meta a
+ Symantic.Typed.Reify: [reflect] :: ReifyReflect repr meta a -> repr a -> meta
+ Symantic.Typed.Reify: [reify] :: ReifyReflect repr meta a -> meta -> repr a
+ Symantic.Typed.Reify: base :: ReifyReflect repr (repr a) a
+ Symantic.Typed.Reify: data ReifyReflect repr meta a
+ Symantic.Typed.Reify: infixr 8 -->
+ Symantic.Typed.Reify: reifyTH :: Name -> Q Exp
+ Symantic.Typed.View: ViewEnv :: (Infix, Side) -> Pair -> Int -> ViewEnv
+ Symantic.Typed.View: [ViewApp] :: View (b -> a) -> View b -> View a
+ Symantic.Typed.View: [ViewInfix] :: Infix -> String -> String -> View (a -> b -> c)
+ Symantic.Typed.View: [ViewUnifix] :: Unifix -> String -> String -> View (a -> b)
+ Symantic.Typed.View: [View] :: (ViewEnv -> ShowS) -> View a
+ Symantic.Typed.View: [viewEnv_lamDepth] :: ViewEnv -> Int
+ Symantic.Typed.View: [viewEnv_op] :: ViewEnv -> (Infix, Side)
+ Symantic.Typed.View: [viewEnv_pair] :: ViewEnv -> Pair
+ Symantic.Typed.View: data View a
+ Symantic.Typed.View: data ViewEnv
+ Symantic.Typed.View: instance Data.String.IsString (Symantic.Typed.View.View a)
+ Symantic.Typed.View: instance GHC.Show.Show (Symantic.Typed.Data.SomeData Symantic.Typed.View.View a)
+ Symantic.Typed.View: instance GHC.Show.Show (Symantic.Typed.View.View a)
+ Symantic.Typed.View: instance GHC.Show.Show c => Symantic.Typed.Lang.Constantable c Symantic.Typed.View.View
+ Symantic.Typed.View: instance Symantic.Typed.Derive.LiftDerived Symantic.Typed.View.View
+ Symantic.Typed.View: instance Symantic.Typed.Lang.Abstractable Symantic.Typed.View.View
+ Symantic.Typed.View: instance Symantic.Typed.Lang.Anythingable Symantic.Typed.View.View
+ Symantic.Typed.View: instance Symantic.Typed.Lang.Bottomable Symantic.Typed.View.View
+ Symantic.Typed.View: instance Symantic.Typed.Lang.Eitherable Symantic.Typed.View.View
+ Symantic.Typed.View: instance Symantic.Typed.Lang.Equalable Symantic.Typed.View.View
+ Symantic.Typed.View: instance Symantic.Typed.Lang.Listable Symantic.Typed.View.View
+ Symantic.Typed.View: instance Symantic.Typed.Lang.Maybeable Symantic.Typed.View.View
+ Symantic.Typed.View: pairView :: ViewEnv -> Infix -> ShowS -> ShowS
+ Symantic.Typed.View: runView :: View a -> ViewEnv -> ShowS
+ Symantic.Typed.View: viewLam :: String -> (View a -> View b) -> View (a -> b)
Files
- .envrc +1/−0
- COPYING +0/−674
- Makefile +44/−0
- cabal.project +1/−0
- default.nix +27/−0
- flake.lock +38/−0
- flake.nix +13/−0
- src/Symantic/Base.hs +0/−17
- src/Symantic/Base/ADT.hs +0/−198
- src/Symantic/Base/Algebrable.hs +0/−128
- src/Symantic/Base/Composable.hs +0/−61
- src/Symantic/Base/CurryN.hs +0/−40
- src/Symantic/Base/Fixity.hs +0/−115
- src/Symantic/Base/Permutable.hs +0/−73
- src/Symantic/Base/Routable.hs +0/−20
- src/Symantic/Dityped.hs +7/−0
- src/Symantic/Dityped/ADT.hs +198/−0
- src/Symantic/Dityped/CurryN.hs +40/−0
- src/Symantic/Dityped/Derive.hs +87/−0
- src/Symantic/Dityped/Lang.hs +246/−0
- src/Symantic/Typed.hs +17/−0
- src/Symantic/Typed/Data.hs +211/−0
- src/Symantic/Typed/Derive.hs +87/−0
- src/Symantic/Typed/Fixity.hs +115/−0
- src/Symantic/Typed/Lang.hs +154/−0
- src/Symantic/Typed/ObserveSharing.hs +330/−0
- src/Symantic/Typed/Optimize.hs +41/−0
- src/Symantic/Typed/Reify.hs +68/−0
- src/Symantic/Typed/View.hs +116/−0
- stack.yaml +0/−1
- stack.yaml.lock +0/−12
- symantic-base.cabal +83/−27
+ .envrc view
@@ -0,0 +1,1 @@+use flake
− COPYING
@@ -1,674 +0,0 @@- GNU GENERAL PUBLIC LICENSE- Version 3, 29 June 2007-- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>- Everyone is permitted to copy and distribute verbatim copies- of this license document, but changing it is not allowed.-- Preamble-- The GNU General Public License is a free, copyleft license for-software and other kinds of works.-- The licenses for most software and other practical works are designed-to take away your freedom to share and change the works. By contrast,-the GNU General Public License is intended to guarantee your freedom to-share and change all versions of a program--to make sure it remains free-software for all its users. We, the Free Software Foundation, use the-GNU General Public License for most of our software; it applies also to-any other work released this way by its authors. You can apply it to-your programs, too.-- When we speak of free software, we are referring to freedom, not-price. Our General Public Licenses are designed to make sure that you-have the freedom to distribute copies of free software (and charge for-them if you wish), that you receive source code or can get it if you-want it, that you can change the software or use pieces of it in new-free programs, and that you know you can do these things.-- To protect your rights, we need to prevent others from denying you-these rights or asking you to surrender the rights. Therefore, you have-certain responsibilities if you distribute copies of the software, or if-you modify it: responsibilities to respect the freedom of others.-- For example, if you distribute copies of such a program, whether-gratis or for a fee, you must pass on to the recipients the same-freedoms that you received. You must make sure that they, too, receive-or can get the source code. And you must show them these terms so they-know their rights.-- Developers that use the GNU GPL protect your rights with two steps:-(1) assert copyright on the software, and (2) offer you this License-giving you legal permission to copy, distribute and/or modify it.-- For the developers' and authors' protection, the GPL clearly explains-that there is no warranty for this free software. For both users' and-authors' sake, the GPL requires that modified versions be marked as-changed, so that their problems will not be attributed erroneously to-authors of previous versions.-- Some devices are designed to deny users access to install or run-modified versions of the software inside them, although the manufacturer-can do so. This is fundamentally incompatible with the aim of-protecting users' freedom to change the software. The systematic-pattern of such abuse occurs in the area of products for individuals to-use, which is precisely where it is most unacceptable. Therefore, we-have designed this version of the GPL to prohibit the practice for those-products. If such problems arise substantially in other domains, we-stand ready to extend this provision to those domains in future versions-of the GPL, as needed to protect the freedom of users.-- Finally, every program is threatened constantly by software patents.-States should not allow patents to restrict development and use of-software on general-purpose computers, but in those that do, we wish to-avoid the special danger that patents applied to a free program could-make it effectively proprietary. To prevent this, the GPL assures that-patents cannot be used to render the program non-free.-- The precise terms and conditions for copying, distribution and-modification follow.-- TERMS AND CONDITIONS-- 0. Definitions.-- "This License" refers to version 3 of the GNU General Public License.-- "Copyright" also means copyright-like laws that apply to other kinds of-works, such as semiconductor masks.-- "The Program" refers to any copyrightable work licensed under this-License. Each licensee is addressed as "you". "Licensees" and-"recipients" may be individuals or organizations.-- To "modify" a work means to copy from or adapt all or part of the work-in a fashion requiring copyright permission, other than the making of an-exact copy. The resulting work is called a "modified version" of the-earlier work or a work "based on" the earlier work.-- A "covered work" means either the unmodified Program or a work based-on the Program.-- To "propagate" a work means to do anything with it that, without-permission, would make you directly or secondarily liable for-infringement under applicable copyright law, except executing it on a-computer or modifying a private copy. Propagation includes copying,-distribution (with or without modification), making available to the-public, and in some countries other activities as well.-- To "convey" a work means any kind of propagation that enables other-parties to make or receive copies. Mere interaction with a user through-a computer network, with no transfer of a copy, is not conveying.-- An interactive user interface displays "Appropriate Legal Notices"-to the extent that it includes a convenient and prominently visible-feature that (1) displays an appropriate copyright notice, and (2)-tells the user that there is no warranty for the work (except to the-extent that warranties are provided), that licensees may convey the-work under this License, and how to view a copy of this License. If-the interface presents a list of user commands or options, such as a-menu, a prominent item in the list meets this criterion.-- 1. Source Code.-- The "source code" for a work means the preferred form of the work-for making modifications to it. "Object code" means any non-source-form of a work.-- A "Standard Interface" means an interface that either is an official-standard defined by a recognized standards body, or, in the case of-interfaces specified for a particular programming language, one that-is widely used among developers working in that language.-- The "System Libraries" of an executable work include anything, other-than the work as a whole, that (a) is included in the normal form of-packaging a Major Component, but which is not part of that Major-Component, and (b) serves only to enable use of the work with that-Major Component, or to implement a Standard Interface for which an-implementation is available to the public in source code form. A-"Major Component", in this context, means a major essential component-(kernel, window system, and so on) of the specific operating system-(if any) on which the executable work runs, or a compiler used to-produce the work, or an object code interpreter used to run it.-- The "Corresponding Source" for a work in object code form means all-the source code needed to generate, install, and (for an executable-work) run the object code and to modify the work, including scripts to-control those activities. However, it does not include the work's-System Libraries, or general-purpose tools or generally available free-programs which are used unmodified in performing those activities but-which are not part of the work. For example, Corresponding Source-includes interface definition files associated with source files for-the work, and the source code for shared libraries and dynamically-linked subprograms that the work is specifically designed to require,-such as by intimate data communication or control flow between those-subprograms and other parts of the work.-- The Corresponding Source need not include anything that users-can regenerate automatically from other parts of the Corresponding-Source.-- The Corresponding Source for a work in source code form is that-same work.-- 2. Basic Permissions.-- All rights granted under this License are granted for the term of-copyright on the Program, and are irrevocable provided the stated-conditions are met. This License explicitly affirms your unlimited-permission to run the unmodified Program. The output from running a-covered work is covered by this License only if the output, given its-content, constitutes a covered work. This License acknowledges your-rights of fair use or other equivalent, as provided by copyright law.-- You may make, run and propagate covered works that you do not-convey, without conditions so long as your license otherwise remains-in force. You may convey covered works to others for the sole purpose-of having them make modifications exclusively for you, or provide you-with facilities for running those works, provided that you comply with-the terms of this License in conveying all material for which you do-not control copyright. Those thus making or running the covered works-for you must do so exclusively on your behalf, under your direction-and control, on terms that prohibit them from making any copies of-your copyrighted material outside their relationship with you.-- Conveying under any other circumstances is permitted solely under-the conditions stated below. Sublicensing is not allowed; section 10-makes it unnecessary.-- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.-- No covered work shall be deemed part of an effective technological-measure under any applicable law fulfilling obligations under article-11 of the WIPO copyright treaty adopted on 20 December 1996, or-similar laws prohibiting or restricting circumvention of such-measures.-- When you convey a covered work, you waive any legal power to forbid-circumvention of technological measures to the extent such circumvention-is effected by exercising rights under this License with respect to-the covered work, and you disclaim any intention to limit operation or-modification of the work as a means of enforcing, against the work's-users, your or third parties' legal rights to forbid circumvention of-technological measures.-- 4. Conveying Verbatim Copies.-- You may convey verbatim copies of the Program's source code as you-receive it, in any medium, provided that you conspicuously and-appropriately publish on each copy an appropriate copyright notice;-keep intact all notices stating that this License and any-non-permissive terms added in accord with section 7 apply to the code;-keep intact all notices of the absence of any warranty; and give all-recipients a copy of this License along with the Program.-- You may charge any price or no price for each copy that you convey,-and you may offer support or warranty protection for a fee.-- 5. Conveying Modified Source Versions.-- You may convey a work based on the Program, or the modifications to-produce it from the Program, in the form of source code under the-terms of section 4, provided that you also meet all of these conditions:-- a) The work must carry prominent notices stating that you modified- it, and giving a relevant date.-- b) The work must carry prominent notices stating that it is- released under this License and any conditions added under section- 7. This requirement modifies the requirement in section 4 to- "keep intact all notices".-- c) You must license the entire work, as a whole, under this- License to anyone who comes into possession of a copy. This- License will therefore apply, along with any applicable section 7- additional terms, to the whole of the work, and all its parts,- regardless of how they are packaged. This License gives no- permission to license the work in any other way, but it does not- invalidate such permission if you have separately received it.-- d) If the work has interactive user interfaces, each must display- Appropriate Legal Notices; however, if the Program has interactive- interfaces that do not display Appropriate Legal Notices, your- work need not make them do so.-- A compilation of a covered work with other separate and independent-works, which are not by their nature extensions of the covered work,-and which are not combined with it such as to form a larger program,-in or on a volume of a storage or distribution medium, is called an-"aggregate" if the compilation and its resulting copyright are not-used to limit the access or legal rights of the compilation's users-beyond what the individual works permit. Inclusion of a covered work-in an aggregate does not cause this License to apply to the other-parts of the aggregate.-- 6. Conveying Non-Source Forms.-- You may convey a covered work in object code form under the terms-of sections 4 and 5, provided that you also convey the-machine-readable Corresponding Source under the terms of this License,-in one of these ways:-- a) Convey the object code in, or embodied in, a physical product- (including a physical distribution medium), accompanied by the- Corresponding Source fixed on a durable physical medium- customarily used for software interchange.-- b) Convey the object code in, or embodied in, a physical product- (including a physical distribution medium), accompanied by a- written offer, valid for at least three years and valid for as- long as you offer spare parts or customer support for that product- model, to give anyone who possesses the object code either (1) a- copy of the Corresponding Source for all the software in the- product that is covered by this License, on a durable physical- medium customarily used for software interchange, for a price no- more than your reasonable cost of physically performing this- conveying of source, or (2) access to copy the- Corresponding Source from a network server at no charge.-- c) Convey individual copies of the object code with a copy of the- written offer to provide the Corresponding Source. This- alternative is allowed only occasionally and noncommercially, and- only if you received the object code with such an offer, in accord- with subsection 6b.-- d) Convey the object code by offering access from a designated- place (gratis or for a charge), and offer equivalent access to the- Corresponding Source in the same way through the same place at no- further charge. You need not require recipients to copy the- Corresponding Source along with the object code. If the place to- copy the object code is a network server, the Corresponding Source- may be on a different server (operated by you or a third party)- that supports equivalent copying facilities, provided you maintain- clear directions next to the object code saying where to find the- Corresponding Source. Regardless of what server hosts the- Corresponding Source, you remain obligated to ensure that it is- available for as long as needed to satisfy these requirements.-- e) Convey the object code using peer-to-peer transmission, provided- you inform other peers where the object code and Corresponding- Source of the work are being offered to the general public at no- charge under subsection 6d.-- A separable portion of the object code, whose source code is excluded-from the Corresponding Source as a System Library, need not be-included in conveying the object code work.-- A "User Product" is either (1) a "consumer product", which means any-tangible personal property which is normally used for personal, family,-or household purposes, or (2) anything designed or sold for incorporation-into a dwelling. In determining whether a product is a consumer product,-doubtful cases shall be resolved in favor of coverage. For a particular-product received by a particular user, "normally used" refers to a-typical or common use of that class of product, regardless of the status-of the particular user or of the way in which the particular user-actually uses, or expects or is expected to use, the product. A product-is a consumer product regardless of whether the product has substantial-commercial, industrial or non-consumer uses, unless such uses represent-the only significant mode of use of the product.-- "Installation Information" for a User Product means any methods,-procedures, authorization keys, or other information required to install-and execute modified versions of a covered work in that User Product from-a modified version of its Corresponding Source. The information must-suffice to ensure that the continued functioning of the modified object-code is in no case prevented or interfered with solely because-modification has been made.-- If you convey an object code work under this section in, or with, or-specifically for use in, a User Product, and the conveying occurs as-part of a transaction in which the right of possession and use of the-User Product is transferred to the recipient in perpetuity or for a-fixed term (regardless of how the transaction is characterized), the-Corresponding Source conveyed under this section must be accompanied-by the Installation Information. But this requirement does not apply-if neither you nor any third party retains the ability to install-modified object code on the User Product (for example, the work has-been installed in ROM).-- The requirement to provide Installation Information does not include a-requirement to continue to provide support service, warranty, or updates-for a work that has been modified or installed by the recipient, or for-the User Product in which it has been modified or installed. Access to a-network may be denied when the modification itself materially and-adversely affects the operation of the network or violates the rules and-protocols for communication across the network.-- Corresponding Source conveyed, and Installation Information provided,-in accord with this section must be in a format that is publicly-documented (and with an implementation available to the public in-source code form), and must require no special password or key for-unpacking, reading or copying.-- 7. Additional Terms.-- "Additional permissions" are terms that supplement the terms of this-License by making exceptions from one or more of its conditions.-Additional permissions that are applicable to the entire Program shall-be treated as though they were included in this License, to the extent-that they are valid under applicable law. If additional permissions-apply only to part of the Program, that part may be used separately-under those permissions, but the entire Program remains governed by-this License without regard to the additional permissions.-- When you convey a copy of a covered work, you may at your option-remove any additional permissions from that copy, or from any part of-it. (Additional permissions may be written to require their own-removal in certain cases when you modify the work.) You may place-additional permissions on material, added by you to a covered work,-for which you have or can give appropriate copyright permission.-- Notwithstanding any other provision of this License, for material you-add to a covered work, you may (if authorized by the copyright holders of-that material) supplement the terms of this License with terms:-- a) Disclaiming warranty or limiting liability differently from the- terms of sections 15 and 16 of this License; or-- b) Requiring preservation of specified reasonable legal notices or- author attributions in that material or in the Appropriate Legal- Notices displayed by works containing it; or-- c) Prohibiting misrepresentation of the origin of that material, or- requiring that modified versions of such material be marked in- reasonable ways as different from the original version; or-- d) Limiting the use for publicity purposes of names of licensors or- authors of the material; or-- e) Declining to grant rights under trademark law for use of some- trade names, trademarks, or service marks; or-- f) Requiring indemnification of licensors and authors of that- material by anyone who conveys the material (or modified versions of- it) with contractual assumptions of liability to the recipient, for- any liability that these contractual assumptions directly impose on- those licensors and authors.-- All other non-permissive additional terms are considered "further-restrictions" within the meaning of section 10. If the Program as you-received it, or any part of it, contains a notice stating that it is-governed by this License along with a term that is a further-restriction, you may remove that term. If a license document contains-a further restriction but permits relicensing or conveying under this-License, you may add to a covered work material governed by the terms-of that license document, provided that the further restriction does-not survive such relicensing or conveying.-- If you add terms to a covered work in accord with this section, you-must place, in the relevant source files, a statement of the-additional terms that apply to those files, or a notice indicating-where to find the applicable terms.-- Additional terms, permissive or non-permissive, may be stated in the-form of a separately written license, or stated as exceptions;-the above requirements apply either way.-- 8. Termination.-- You may not propagate or modify a covered work except as expressly-provided under this License. Any attempt otherwise to propagate or-modify it is void, and will automatically terminate your rights under-this License (including any patent licenses granted under the third-paragraph of section 11).-- However, if you cease all violation of this License, then your-license from a particular copyright holder is reinstated (a)-provisionally, unless and until the copyright holder explicitly and-finally terminates your license, and (b) permanently, if the copyright-holder fails to notify you of the violation by some reasonable means-prior to 60 days after the cessation.-- Moreover, your license from a particular copyright holder is-reinstated permanently if the copyright holder notifies you of the-violation by some reasonable means, this is the first time you have-received notice of violation of this License (for any work) from that-copyright holder, and you cure the violation prior to 30 days after-your receipt of the notice.-- Termination of your rights under this section does not terminate the-licenses of parties who have received copies or rights from you under-this License. If your rights have been terminated and not permanently-reinstated, you do not qualify to receive new licenses for the same-material under section 10.-- 9. Acceptance Not Required for Having Copies.-- You are not required to accept this License in order to receive or-run a copy of the Program. Ancillary propagation of a covered work-occurring solely as a consequence of using peer-to-peer transmission-to receive a copy likewise does not require acceptance. However,-nothing other than this License grants you permission to propagate or-modify any covered work. These actions infringe copyright if you do-not accept this License. Therefore, by modifying or propagating a-covered work, you indicate your acceptance of this License to do so.-- 10. Automatic Licensing of Downstream Recipients.-- Each time you convey a covered work, the recipient automatically-receives a license from the original licensors, to run, modify and-propagate that work, subject to this License. You are not responsible-for enforcing compliance by third parties with this License.-- An "entity transaction" is a transaction transferring control of an-organization, or substantially all assets of one, or subdividing an-organization, or merging organizations. If propagation of a covered-work results from an entity transaction, each party to that-transaction who receives a copy of the work also receives whatever-licenses to the work the party's predecessor in interest had or could-give under the previous paragraph, plus a right to possession of the-Corresponding Source of the work from the predecessor in interest, if-the predecessor has it or can get it with reasonable efforts.-- You may not impose any further restrictions on the exercise of the-rights granted or affirmed under this License. For example, you may-not impose a license fee, royalty, or other charge for exercise of-rights granted under this License, and you may not initiate litigation-(including a cross-claim or counterclaim in a lawsuit) alleging that-any patent claim is infringed by making, using, selling, offering for-sale, or importing the Program or any portion of it.-- 11. Patents.-- A "contributor" is a copyright holder who authorizes use under this-License of the Program or a work on which the Program is based. The-work thus licensed is called the contributor's "contributor version".-- A contributor's "essential patent claims" are all patent claims-owned or controlled by the contributor, whether already acquired or-hereafter acquired, that would be infringed by some manner, permitted-by this License, of making, using, or selling its contributor version,-but do not include claims that would be infringed only as a-consequence of further modification of the contributor version. For-purposes of this definition, "control" includes the right to grant-patent sublicenses in a manner consistent with the requirements of-this License.-- Each contributor grants you a non-exclusive, worldwide, royalty-free-patent license under the contributor's essential patent claims, to-make, use, sell, offer for sale, import and otherwise run, modify and-propagate the contents of its contributor version.-- In the following three paragraphs, a "patent license" is any express-agreement or commitment, however denominated, not to enforce a patent-(such as an express permission to practice a patent or covenant not to-sue for patent infringement). To "grant" such a patent license to a-party means to make such an agreement or commitment not to enforce a-patent against the party.-- If you convey a covered work, knowingly relying on a patent license,-and the Corresponding Source of the work is not available for anyone-to copy, free of charge and under the terms of this License, through a-publicly available network server or other readily accessible means,-then you must either (1) cause the Corresponding Source to be so-available, or (2) arrange to deprive yourself of the benefit of the-patent license for this particular work, or (3) arrange, in a manner-consistent with the requirements of this License, to extend the patent-license to downstream recipients. "Knowingly relying" means you have-actual knowledge that, but for the patent license, your conveying the-covered work in a country, or your recipient's use of the covered work-in a country, would infringe one or more identifiable patents in that-country that you have reason to believe are valid.-- If, pursuant to or in connection with a single transaction or-arrangement, you convey, or propagate by procuring conveyance of, a-covered work, and grant a patent license to some of the parties-receiving the covered work authorizing them to use, propagate, modify-or convey a specific copy of the covered work, then the patent license-you grant is automatically extended to all recipients of the covered-work and works based on it.-- A patent license is "discriminatory" if it does not include within-the scope of its coverage, prohibits the exercise of, or is-conditioned on the non-exercise of one or more of the rights that are-specifically granted under this License. You may not convey a covered-work if you are a party to an arrangement with a third party that is-in the business of distributing software, under which you make payment-to the third party based on the extent of your activity of conveying-the work, and under which the third party grants, to any of the-parties who would receive the covered work from you, a discriminatory-patent license (a) in connection with copies of the covered work-conveyed by you (or copies made from those copies), or (b) primarily-for and in connection with specific products or compilations that-contain the covered work, unless you entered into that arrangement,-or that patent license was granted, prior to 28 March 2007.-- Nothing in this License shall be construed as excluding or limiting-any implied license or other defenses to infringement that may-otherwise be available to you under applicable patent law.-- 12. No Surrender of Others' Freedom.-- If conditions are imposed on you (whether by court order, agreement or-otherwise) that contradict the conditions of this License, they do not-excuse you from the conditions of this License. If you cannot convey a-covered work so as to satisfy simultaneously your obligations under this-License and any other pertinent obligations, then as a consequence you may-not convey it at all. For example, if you agree to terms that obligate you-to collect a royalty for further conveying from those to whom you convey-the Program, the only way you could satisfy both those terms and this-License would be to refrain entirely from conveying the Program.-- 13. Use with the GNU Affero General Public License.-- Notwithstanding any other provision of this License, you have-permission to link or combine any covered work with a work licensed-under version 3 of the GNU Affero General Public License into a single-combined work, and to convey the resulting work. The terms of this-License will continue to apply to the part which is the covered work,-but the special requirements of the GNU Affero General Public License,-section 13, concerning interaction through a network will apply to the-combination as such.-- 14. Revised Versions of this License.-- The Free Software Foundation may publish revised and/or new versions of-the GNU General Public License from time to time. Such new versions will-be similar in spirit to the present version, but may differ in detail to-address new problems or concerns.-- Each version is given a distinguishing version number. If the-Program specifies that a certain numbered version of the GNU General-Public License "or any later version" applies to it, you have the-option of following the terms and conditions either of that numbered-version or of any later version published by the Free Software-Foundation. If the Program does not specify a version number of the-GNU General Public License, you may choose any version ever published-by the Free Software Foundation.-- If the Program specifies that a proxy can decide which future-versions of the GNU General Public License can be used, that proxy's-public statement of acceptance of a version permanently authorizes you-to choose that version for the Program.-- Later license versions may give you additional or different-permissions. However, no additional obligations are imposed on any-author or copyright holder as a result of your choosing to follow a-later version.-- 15. Disclaimer of Warranty.-- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.-- 16. Limitation of Liability.-- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF-SUCH DAMAGES.-- 17. Interpretation of Sections 15 and 16.-- If the disclaimer of warranty and limitation of liability provided-above cannot be given local legal effect according to their terms,-reviewing courts shall apply local law that most closely approximates-an absolute waiver of all civil liability in connection with the-Program, unless a warranty or assumption of liability accompanies a-copy of the Program in return for a fee.-- END OF TERMS AND CONDITIONS-- How to Apply These Terms to Your New Programs-- If you develop a new program, and you want it to be of the greatest-possible use to the public, the best way to achieve this is to make it-free software which everyone can redistribute and change under these terms.-- To do so, attach the following notices to the program. It is safest-to attach them to the start of each source file to most effectively-state the exclusion of warranty; and each file should have at least-the "copyright" line and a pointer to where the full notice is found.-- <one line to give the program's name and a brief idea of what it does.>- Copyright (C) <year> <name of author>-- This program is free software: you can redistribute it and/or modify- it under the terms of the GNU General Public License as published by- the Free Software Foundation, either version 3 of the License, or- (at your option) any later version.-- This program is distributed in the hope that it will be useful,- but WITHOUT ANY WARRANTY; without even the implied warranty of- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the- GNU General Public License for more details.-- You should have received a copy of the GNU General Public License- along with this program. If not, see <http://www.gnu.org/licenses/>.--Also add information on how to contact you by electronic and paper mail.-- If the program does terminal interaction, make it output a short-notice like this when it starts in an interactive mode:-- <program> Copyright (C) <year> <name of author>- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.- This is free software, and you are welcome to redistribute it- under certain conditions; type `show c' for details.--The hypothetical commands `show w' and `show c' should show the appropriate-parts of the General Public License. Of course, your program's commands-might be different; for a GUI interface, you would use an "about box".-- You should also get your employer (if you work as a programmer) or school,-if any, to sign a "copyright disclaimer" for the program, if necessary.-For more information on this, and how to apply and follow the GNU GPL, see-<http://www.gnu.org/licenses/>.-- The GNU General Public License does not permit incorporating your program-into proprietary programs. If your program is a subroutine library, you-may consider it more useful to permit linking proprietary applications with-the library. If this is what you want to do, use the GNU Lesser General-Public License instead of this License. But first, please read-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+ Makefile view
@@ -0,0 +1,44 @@+override REPL_OPTIONS += -ignore-dot-ghci++cabal := $(wildcard *.cabal)+package := $(notdir ./$(cabal:.cabal=))+version := $(shell sed -ne 's/^version: *\(.*\)/\1/p' $(cabal))+project := $(patsubst %.cabal,%,$(cabal))++all: build+build:+ cabal build $(CABAL_BUILD_FLAGS)+clean c:+ cabal clean+repl:+ cabal repl $(CABAL_REPL_FLAGS) $(project)+ghcid:+ ghcid -c 'cabal repl $(CABAL_REPL_FLAGS) $(project) --repl-options "$(REPL_OPTIONS)"' --reverse-errors++doc:+ cabal haddock --haddock-css ocean --haddock-hyperlink-source++tag:+ git tag --merged | grep -Fqx "$(package)-$(version)" || \+ git tag -f -s -m "$(package) v$(version)" $(package)-$(version)++tar:+ cabal sdist+ cabal haddock --haddock-for-hackage --enable-doc+upload: LANG=C+upload: tar+ cabal upload $(CABAL_UPLOAD_FLAGS) dist-newstyle/sdist/$(package)-$(version).tar.gz+ cabal upload $(CABAL_UPLOAD_FLAGS) --documentation dist-newstyle/$(package)-$(version)-docs.tar.gz+%/publish: CABAL_UPLOAD_FLAGS+=--publish+%/publish: %+ +publish: upload/publish++nix-build:+ nix -L build+nix-relock:+ nix flake update --recreate-lock-file+nix-repl:+ nix -L develop --command cabal repl $(CABAL_REPL_FLAGS)+nix-shell:+ nix -L develop
+ cabal.project view
@@ -0,0 +1,1 @@+packages:.
+ default.nix view
@@ -0,0 +1,27 @@+{ pkgs ? import <nixpkgs> {}+, ghc ? null+, withHoogle ? false+}:+let+ haskellPackages =+ if ghc == null+ then pkgs.haskellPackages+ else pkgs.haskell.packages.${ghc};+ hs = haskellPackages.extend (with pkgs.haskell.lib; hself: hsuper: {+ symantic-base = buildFromSdist (hself.callCabal2nix "symantic-base" ./. {});+ });+in hs.symantic-base // {+ shell = hs.shellFor {+ doBenchmark = true;+ packages = p: [ p.symantic-base ];+ nativeBuildInputs = [+ hs.cabal-install+ hs.ghcid+ hs.haskell-language-server+ hs.hlint+ ];+ buildInputs = [+ ];+ inherit withHoogle;+ };+}
+ flake.lock view
@@ -0,0 +1,38 @@+{+ "nodes": {+ "flake-utils": {+ "locked": {+ "lastModified": 1623875721,+ "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=",+ "owner": "numtide",+ "repo": "flake-utils",+ "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772",+ "type": "github"+ },+ "original": {+ "owner": "numtide",+ "repo": "flake-utils",+ "type": "github"+ }+ },+ "nixpkgs": {+ "locked": {+ "narHash": "sha256-3C35/g5bJ3KH67fOpxTkqDpfJ1CHYrO2bbl+fPgqfMQ=",+ "path": "/nix/store/6g7dgkinzm4rvwmpfp9avklsb4hiqals-nixpkgs-patched",+ "type": "path"+ },+ "original": {+ "id": "nixpkgs",+ "type": "indirect"+ }+ },+ "root": {+ "inputs": {+ "flake-utils": "flake-utils",+ "nixpkgs": "nixpkgs"+ }+ }+ },+ "root": "root",+ "version": 7+}
+ flake.nix view
@@ -0,0 +1,13 @@+{+inputs.nixpkgs.url = "flake:nixpkgs";+#inputs.nixpkgs.url = "github:NixOS/nixpkgs";+inputs.flake-utils.url = "github:numtide/flake-utils";+outputs = inputs:+ inputs.flake-utils.lib.eachDefaultSystem (system: let+ pkgs = inputs.nixpkgs.legacyPackages.${system};+ in {+ defaultPackage = import ./default.nix { inherit pkgs; };+ devShell = (import ./default.nix { inherit pkgs; }).shell;+ }+ );+}
− src/Symantic/Base.hs
@@ -1,17 +0,0 @@-module Symantic.Base- ( module Symantic.Base.ADT- , module Symantic.Base.Algebrable- , module Symantic.Base.Composable- , module Symantic.Base.CurryN- , module Symantic.Base.Fixity- , module Symantic.Base.Permutable- , module Symantic.Base.Routable- ) where--import Symantic.Base.ADT-import Symantic.Base.Algebrable-import Symantic.Base.Composable-import Symantic.Base.CurryN-import Symantic.Base.Fixity-import Symantic.Base.Permutable-import Symantic.Base.Routable
− src/Symantic/Base/ADT.hs
@@ -1,198 +0,0 @@-{-# LANGUAGE AllowAmbiguousTypes #-}-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE ConstraintKinds #-}-{-# LANGUAGE InstanceSigs #-}-{-# LANGUAGE EmptyCase #-}-{-# LANGUAGE PolyKinds #-}-{-# LANGUAGE UndecidableInstances #-}--- | EOT (Either of Tuples) to/from ADT (Algebraic Data Type).--- to produce or consume custom ADT with @('<:>')@ and @('<+>')@.------ This is like what is done in @generic-sop@:--- https://hackage.haskell.org/package/generics-sop-0.5.1.0/docs/src/Generics.SOP.GGP.html#gSumFrom--- but using directly 'Either' and 'Tuples'--- instead of passing by the intermediary GADTs @NP@ and @NS@.-module Symantic.Base.ADT where--import Data.Either (Either(..))-import Data.Void (Void, absurd)-import Data.Function (($), (.), id, const)-import GHC.Generics as Generics---- * Type family 'EoT'--- Return an 'Either' of 'Tuples' from the given 'ADT',--- matching the nesting occuring when using @('<:>')@ and ('<+>')@--- and their associativity and precedence,--- with no parenthesis messing around.-type family EoT (adt :: [[*]]) :: * where- -- This is 'absurd'- EoT '[] = Void- -- There Is No Alternative- EoT '[ ps ] = Tuples ps- -- The right associativity of @('<+>')@- -- puts leaves on 'Left' and nodes on 'Right'- EoT (ps ': ss) = Either (Tuples ps) (EoT ss)---- * Type family 'Tuples'--- | Return the type of 'snd'-nested 2-tuples--- from the given list of types.-type family Tuples (as :: [*]) :: (r :: *) where- Tuples '[] = ()- Tuples '[a] = a- Tuples (a ': rest) = (a, Tuples rest)---- * Type 'ADT'--- | Normalized type-level representation of an Algebraic Data Type.-type ADT (adt :: *) = ListOfRepSums (Rep adt) '[]---- ** Type family 'ListOfRepSums'--- | Collect the alternatives in a continuation passing-style.-type family ListOfRepSums (a :: * -> *) (ss :: [[*]]) :: [[*]]-type instance ListOfRepSums (a:+:b) ss = ListOfRepSums a (ListOfRepSums b ss)--- | Meta-information for datatypes-type instance ListOfRepSums (M1 D _c a) ss = ListOfRepSums a ss--- | Meta-information for constructors-type instance ListOfRepSums (M1 C _c a) ss = ListOfRepProducts a '[] ': ss--- | Empty datatypes-type instance ListOfRepSums V1 ss = ss---- ** Type family 'ListOfRepProducts'--- | Collect the records in a continuation passing-style.-type family ListOfRepProducts (a :: * -> *) (ps :: [*]) :: [*]-type instance ListOfRepProducts (a:*:b) ps = ListOfRepProducts a (ListOfRepProducts b ps)--- | Meta-information for record selectors-type instance ListOfRepProducts (M1 S _c a) ps = TypeOfRepField a ': ps--- | Constructor without fields-type instance ListOfRepProducts U1 ps = ps---- ** Type family 'TypeOfRepField'-type family TypeOfRepField (a :: * -> *) :: *-type instance TypeOfRepField (K1 _i a) = a---- * Class 'RepOfEoT'-type RepOfEoT a = RepOfEithers (Rep a) '[]---- | Morph the 'Either' of 'Tuples' corresponding to an 'ADT'--- into a constructor of this 'ADT'.--- This is the reverse of 'eotOfadt'.-adtOfeot :: Generic a => RepOfEoT a => EoT (ADT a) -> a-adtOfeot eot = Generics.to $ repOfEithers @_ @'[] eot id absurd---- ** Class 'RepOfEithers'-class RepOfEithers (a :: * -> *) ss where- -- | Parse the 'Either' (list-like) binary tree of 'EoT'- -- into the @(':+:')@ (balanced) binary tree of 'Rep',- -- using continuation passing-style for performance.- repOfEithers ::- EoT (ListOfRepSums a ss) ->- -- the 'a' 'Rep' is the current alternative in the 'EoT'- (a x -> r) ->- -- the 'a' 'Rep' is a following alternative in the 'EoT'- (EoT ss -> r) ->- r-instance (RepOfEithers a (ListOfRepSums b ss), RepOfEithers b ss) => RepOfEithers (a:+:b) ss where- repOfEithers eot ok ko =- -- try to parse 'a' on the current 'eot'- repOfEithers @a @(ListOfRepSums b ss) eot- (ok . L1)- (\next ->- -- parsing 'a' failed- -- try to parse 'b' on the 'Right' of the current 'eot'- repOfEithers @b @ss next- (ok . R1)- ko -- parsing 'b' failed: backtrack- )-instance RepOfEithers a ss => RepOfEithers (M1 D c a) ss where- repOfEithers eot ok = repOfEithers @a @ss eot (ok . M1)-instance RepOfTuples a '[] => RepOfEithers (M1 C c a) (ps ': ss) where- repOfEithers eot ok ko =- case eot of- -- 'EoT' is a leaf, and 'Rep' too: parsing succeeds- Left ts -> ok $ M1 $ repOfTuples @a @'[] ts const- -- 'EoT' is a node, but 'Rep' is a leaf: parsing fails- Right ss -> ko ss-instance RepOfTuples a '[] => RepOfEithers (M1 C c a) '[] where- repOfEithers eot ok _ko = ok $ M1 $ repOfTuples @_ @'[] eot const-instance RepOfEithers V1 ss where- repOfEithers eot _ok ko = ko eot---- ** Class 'RepOfTuples'-class RepOfTuples (a :: * -> *) (xs::[*]) where- -- | Parse the 'Tuples' (list-like) binary tree of 'EoT'- -- into the @(':*:')@ (balanced) binary tree of 'Rep',- -- using continuation passing-style for performance.- repOfTuples ::- Tuples (ListOfRepProducts a xs) ->- (a x -> Tuples xs -> r) -> r-instance (RepOfTuples a (ListOfRepProducts b ps), RepOfTuples b ps) => RepOfTuples (a:*:b) ps where- repOfTuples ts k =- -- uncons 'a'- repOfTuples @a @(ListOfRepProducts b ps) ts- (\a ts' ->- -- uncons 'b'- repOfTuples @b @ps ts'- (\b -> k (a:*:b)))-instance RepOfField a => RepOfTuples (M1 S c a) (p ': ps) where- repOfTuples (a, ts) k = k (M1 (repOfField a)) ts-instance RepOfField a => RepOfTuples (M1 S c a) '[] where- repOfTuples a k = k (M1 (repOfField a)) ()-instance RepOfTuples U1 ps where- repOfTuples ts k = k U1 ts---- ** Class 'RepOfField'-class RepOfField (a :: * -> *) where- repOfField :: TypeOfRepField a -> a x-instance RepOfField (K1 i a) where- repOfField = K1---- * Class 'EoTOfRep'-type EoTOfRep a = EithersOfRep (Rep a) '[]---- | Morph the constructor of an 'ADT'--- into the corresponding 'Either' of 'Tuples' of this 'ADT'.--- This is the reverse of 'adtOfeot'.-eotOfadt :: Generic a => EoTOfRep a => a -> EoT (ADT a)-eotOfadt = eithersOfRepL @_ @'[] . Generics.from---- ** Class 'EithersOfRep'-class EithersOfRep (a :: * -> *) ss where- eithersOfRepL :: a x -> EoT (ListOfRepSums a ss)- eithersOfRepR :: EoT ss -> EoT (ListOfRepSums a ss)-instance (EithersOfRep a (ListOfRepSums b ss), EithersOfRep b ss) =>- EithersOfRep (a:+:b) ss where- eithersOfRepL = \case- L1 a -> eithersOfRepL @a @(ListOfRepSums b ss) a- R1 b -> eithersOfRepR @a @(ListOfRepSums b ss) (eithersOfRepL @b @ss b)- eithersOfRepR ss = eithersOfRepR @a @(ListOfRepSums b ss) (eithersOfRepR @b @ss ss)-instance EithersOfRep a ss => EithersOfRep (M1 D c a) ss where- eithersOfRepL (M1 a) = eithersOfRepL @a @ss a- eithersOfRepR = eithersOfRepR @a @ss-instance TuplesOfRep a '[] => EithersOfRep (M1 C c a) '[] where- eithersOfRepL (M1 a) = tuplesOfRep @_ @'[] a ()- eithersOfRepR = absurd-instance TuplesOfRep a '[] => EithersOfRep (M1 C c a) (ps ': ss) where- eithersOfRepL (M1 a) = Left $ tuplesOfRep @_ @'[] a ()- eithersOfRepR = Right-instance EithersOfRep V1 ss where- eithersOfRepL = \case {}- eithersOfRepR = id---- ** Class 'TuplesOfRep'-class TuplesOfRep (a :: * -> *) (ps::[*]) where- tuplesOfRep :: a x -> Tuples ps -> Tuples (ListOfRepProducts a ps)-instance (TuplesOfRep a (ListOfRepProducts b ps), TuplesOfRep b ps) => TuplesOfRep (a:*:b) ps where- tuplesOfRep (a:*:b) ps =- tuplesOfRep @a @(ListOfRepProducts b ps) a- (tuplesOfRep @b @ps b ps)-instance TuplesOfRep U1 ps where- tuplesOfRep U1 xs = xs-instance FieldOfRep a => TuplesOfRep (M1 S c a) (x ': ps) where- tuplesOfRep (M1 a) xs = (fieldOfRep a, xs)-instance FieldOfRep a => TuplesOfRep (M1 S c a) '[] where- tuplesOfRep (M1 a) _xs = fieldOfRep a---- ** Class 'FieldOfRep'-class FieldOfRep (a :: * -> *) where- fieldOfRep :: a x -> TypeOfRepField a-instance FieldOfRep (K1 i a) where- fieldOfRep (K1 a) = a
− src/Symantic/Base/Algebrable.hs
@@ -1,128 +0,0 @@-module Symantic.Base.Algebrable where--import Data.Either (Either)-import Data.Function ((.))-import Data.Maybe (Maybe(..))-import Data.Proxy (Proxy(..))-import GHC.Generics (Generic)--import Symantic.Base.ADT-import Symantic.Base.CurryN-import Symantic.Base.Composable---- | @('adt' @@SomeADT some_expr)@--- wrap\/unwrap @(some_expr)@ input\/output value--- to\/from the Algebraic Data Type @(SomeADT)@.--- @(SomeADT)@ must have a 'Generic' instance--- (using the @DeriveGeneric@ language extension to GHC).-adt ::- forall adt repr k.- Dimapable repr =>- Generic adt =>- RepOfEoT adt =>- EoTOfRep adt =>- repr (EoT (ADT adt) -> k) k ->- repr (adt -> k) k-adt = dimap adtOfeot eotOfadt---- * Class 'Tupable'-class Tupable repr where- default (<:>) :: Transformable repr => Tupable (UnTrans repr) =>- repr (a->k) k -> repr (b->k) k -> repr ((a,b)->k) k- (<:>) :: repr (a->k) k -> repr (b->k) k -> repr ((a,b)->k) k- (<:>) = trans2 (<:>)-infixr 4 <:>---- ** Class 'Unitable'-class Unitable repr where- default unit :: Transformable repr => Unitable (UnTrans repr) =>- repr (() -> k) k- unit :: repr (() -> k) k- unit = noTrans unit---- ** Class 'Constant'-class Constant repr where- default constant :: Transformable repr => Constant (UnTrans repr) =>- a -> repr (a -> k) k- constant :: a -> repr (a -> k) k- constant = noTrans . constant---- * Class 'Eitherable'-class Eitherable repr where- default (<+>) :: Transformable repr => Eitherable (UnTrans repr) =>- repr (a->k) k -> repr (b->k) k -> repr (Either a b -> k) k- (<+>) :: repr (a->k) k -> repr (b->k) k -> repr (Either a b->k) k- (<+>) = trans2 (<+>)--- NOTE: yes infixr, not infixl like <|>,--- in order to run left-most checks first.-infixr 3 <+>---- ** Class 'Emptyable'-class Emptyable repr where- default empty :: Transformable repr => Emptyable (UnTrans repr) =>- repr k k- empty :: repr k k- empty = noTrans empty---- ** Class 'Optionable'-class Optionable repr where- default option :: Transformable repr => Optionable (UnTrans repr) =>- repr k k -> repr k k- option :: repr k k -> repr k k- option = trans1 option- default optional :: Transformable repr => Optionable (UnTrans repr) =>- repr (a->k) k -> repr (Maybe a->k) k- optional :: repr (a->k) k -> repr (Maybe a->k) k- optional = trans1 optional---- * Class 'Repeatable'-class Repeatable repr where- default many0 :: Transformable repr => Repeatable (UnTrans repr) =>- repr (a->k) k -> repr ([a]->k) k- many0 :: repr (a->k) k -> repr ([a]->k) k- many0 = trans1 many0- default many1 :: Transformable repr => Repeatable (UnTrans repr) =>- repr (a->k) k -> repr ([a]->k) k- many1 :: repr (a->k) k -> repr ([a]->k) k- many1 = trans1 many1---- * Class 'Substractable'-class Substractable repr where- default (<->) :: Transformable repr => Substractable (UnTrans repr) =>- repr a k -> repr k' k' -> repr a k- (<->) :: repr a k -> repr k' k' -> repr a k- (<->) = trans2 (<->)-infixr 3 <->---- * Class 'Dicurryable'-class Dicurryable repr where- dicurry ::- CurryN args =>- proxy args ->- (args-..->r) -> -- construction- (r->Tuples args) -> -- destruction- repr (args-..->k) k ->- repr (r->k) k- default dicurry ::- Transformable repr =>- Dicurryable (UnTrans repr) =>- CurryN args =>- proxy args ->- (args-..->r) ->- (r->Tuples args) ->- repr (args-..->k) k ->- repr (r->k) k- dicurry args constr destr = trans1 (dicurry args constr destr)--construct ::- forall args a k repr.- Dicurryable repr =>- Generic a =>- EoTOfRep a =>- CurryN args =>- Tuples args ~ EoT (ADT a) =>- (args ~ Args (args-..->a)) =>- (args-..->a) ->- repr (args-..->k) k ->- repr (a -> k) k-construct f = dicurry (Proxy::Proxy args) f eotOfadt
− src/Symantic/Base/Composable.hs
@@ -1,61 +0,0 @@-module Symantic.Base.Composable where--import Data.Function ((.))---- * Class 'Composable'-class Composable repr where- default (<.>) :: Transformable repr => Composable (UnTrans repr) =>- repr a b -> repr b c -> repr a c- (<.>) :: repr a b -> repr b c -> repr a c- (<.>) = trans2 (<.>)-infixr 4 <.>---- * Class 'Voidable'-class Voidable repr where- default void :: Transformable repr => Voidable (UnTrans repr) =>- a -> repr (a -> b) k -> repr b k- void :: a -> repr (a -> b) k -> repr b k- void a = trans1 (void a)---- * Class 'Transformable'--- | Used with @DefaultSignatures@ and default methods,--- in the symantics class definition,--- it then avoids on an interpreter instance--- to define unused methods.-class Transformable repr where- -- | The underlying representation that @(repr)@ transforms.- type UnTrans repr :: * -> * -> *- -- | Lift the underlying representation to @(repr)@.- -- Useful to define a combinator that does nothing - -- in a transformation.- noTrans :: UnTrans repr a b -> repr a b- -- | Unlift a representation. Useful when a transformation- -- combinator needs to access the 'UnTrans'formed representation,- -- or at the end to get the underlying 'UnTrans'formed representation- -- from the inferred @(repr)@ value.- unTrans :: repr a b -> UnTrans repr a b- -- | Convenient helper lifing an unary operator,- -- but also enables to identify unary operators.- trans1 :: (UnTrans repr a b -> UnTrans repr c d) -> repr a b -> repr c d- trans1 f = noTrans . f . unTrans- -- | Convenient helper lifting a binary operator,- -- but also enables to identify binary operators.- trans2 :: (UnTrans repr a b -> UnTrans repr c d -> UnTrans repr e f) -> repr a b -> repr c d -> repr e f- trans2 f x y = noTrans (f (unTrans x) (unTrans y))---- ** Type 'IdentityTrans'--- | A 'Transformable' that does nothing.-newtype IdentityTrans repr a k- = IdentityTrans- { unIdentityTrans :: repr a k }-instance Transformable (IdentityTrans repr) where- type UnTrans (IdentityTrans repr) = repr- noTrans = IdentityTrans- unTrans = unIdentityTrans---- * Class 'Dimapable'-class Dimapable repr where- default dimap :: Transformable repr => Dimapable (UnTrans repr) =>- (a->b) -> (b->a) -> repr (a->k) k -> repr (b->k) k- dimap :: (a->b) -> (b->a) -> repr (a->k) k -> repr (b->k) k- dimap a2b b2a = trans1 (dimap a2b b2a)
− src/Symantic/Base/CurryN.hs
@@ -1,40 +0,0 @@-{-# LANGUAGE AllowAmbiguousTypes #-}-{-# LANGUAGE DataKinds #-}-module Symantic.Base.CurryN where--import Data.Function (($), (.))--import Symantic.Base.ADT (Tuples)---- * Class 'CurryN'--- | Produce and consume 'Tuples'.--- Not actually useful for the Generic side of this module,--- but related through the use of 'Tuples'.-class CurryN args where- -- Like 'curry' but for an arbitrary number of nested 2-tuples.- curryN :: (Tuples args -> res) -> args-..->res- -- Like 'uncurry' but for an arbitrary number of nested 2-tuples.- uncurryN :: (args-..->res) -> Tuples args -> res- -- Like 'fmap' on @('->')@ but for an arbitrary number of arguments.- mapresultN :: (a->b) -> (args-..->a) -> args-..->b-instance CurryN '[a] where- curryN = ($)- uncurryN = ($)- mapresultN = (.)-instance CurryN (b ': as) => CurryN (a ': b ': as) where- curryN f x = curryN @(b ': as) (\xs -> f (x, xs))- uncurryN f (x, xs) = uncurryN @(b ': as) (f x) xs- mapresultN f as2r = mapresultN @(b ': as) f . as2r---- ** Type family ('-..->')-type family (args :: [*]) -..-> (r :: *) :: * where- '[] -..-> r = r- (a : args) -..-> r = a -> args -..-> r--- ** Type family 'Args'-type family Args (f :: *) :: [*] where- Args (a -> r) = a : Args r- Args r = '[]--- ** Type family 'Result'-type family Result (as :: *) :: * where- Result (a -> r) = Result r- Result r = r
− src/Symantic/Base/Fixity.hs
@@ -1,115 +0,0 @@-module Symantic.Base.Fixity where--import Data.Bool-import Data.Eq (Eq(..))-import Data.Function ((.))-import Data.Int (Int)-import Data.Maybe (Maybe(..))-import Data.Ord (Ord(..))-import Data.Semigroup-import Data.String (String, IsString(..))-import Text.Show (Show(..))---- * Type 'Fixity'-data Fixity- = Fixity1 Unifix- | Fixity2 Infix- deriving (Eq, Show)---- ** Type 'Unifix'-data Unifix- = Prefix { unifix_precedence :: Precedence }- | Postfix { unifix_precedence :: Precedence }- deriving (Eq, Show)---- ** Type 'Infix'-data Infix- = Infix- { infix_associativity :: Maybe Associativity- , infix_precedence :: Precedence- } deriving (Eq, Show)--infixL :: Precedence -> Infix-infixL = Infix (Just AssocL)--infixR :: Precedence -> Infix-infixR = Infix (Just AssocR)--infixB :: Side -> Precedence -> Infix-infixB = Infix . Just . AssocB--infixN :: Precedence -> Infix-infixN = Infix Nothing--infixN0 :: Infix-infixN0 = infixN 0--infixN5 :: Infix-infixN5 = infixN 5---- | Given 'Precedence' and 'Associativity' of its parent operator,--- and the operand 'Side' it is in,--- return whether an 'Infix' operator--- needs to be enclosed by a 'Pair'.-isPairNeeded :: (Infix, Side) -> Infix -> Bool-isPairNeeded (po, lr) op =- infix_precedence op < infix_precedence po- || infix_precedence op == infix_precedence po- && not associate- where- associate =- case (lr, infix_associativity po) of- (_, Just AssocB{}) -> True- (SideL, Just AssocL) -> True- (SideR, Just AssocR) -> True- _ -> False---- | If 'isPairNeeded' is 'True',--- enclose the given 'IsString' by given 'Pair',--- otherwise returns the same 'IsString'.-pairIfNeeded ::- Semigroup s => IsString s =>- Pair -> (Infix, Side) -> Infix ->- s -> s-pairIfNeeded (o,c) po op s =- if isPairNeeded po op- then fromString o <> s <> fromString c- else s---- * Type 'Precedence'-type Precedence = Int---- ** Class 'PrecedenceOf'-class PrecedenceOf a where- precedence :: a -> Precedence-instance PrecedenceOf Fixity where- precedence (Fixity1 uni) = precedence uni- precedence (Fixity2 inf) = precedence inf-instance PrecedenceOf Unifix where- precedence = unifix_precedence-instance PrecedenceOf Infix where- precedence = infix_precedence---- * Type 'Associativity'-data Associativity- = AssocL -- ^ Associate to the left: @a ¹ b ² c == (a ¹ b) ² c@- | AssocR -- ^ Associate to the right: @a ¹ b ² c == a ¹ (b ² c)@- | AssocB Side -- ^ Associate to both sides, but to 'Side' when reading.- deriving (Eq, Show)---- ** Type 'Side'-data Side- = SideL -- ^ Left- | SideR -- ^ Right- deriving (Eq, Show)---- ** Type 'Pair'-type Pair = (String, String)-pairAngle :: Pair-pairBrace :: Pair-pairBracket :: Pair-pairParen :: Pair-pairAngle = ("<",">")-pairBrace = ("{","}")-pairBracket = ("[","]")-pairParen = ("(",")")
− src/Symantic/Base/Permutable.hs
@@ -1,73 +0,0 @@-{-# LANGUAGE TypeFamilyDependencies #-}-{-# LANGUAGE UndecidableInstances #-}-module Symantic.Base.Permutable where--import Data.Function ((.))-import Data.Maybe (Maybe(..), fromJust)--import Symantic.Base.Composable-import Symantic.Base.Algebrable---- * Class 'Permutable'-class Permutable repr where- -- Use @TypeFamilyDependencies@ to help type-inference infer @(repr)@.- type Permutation (repr:: * -> * -> *) = (r :: * -> * -> *) | r -> repr- type Permutation repr = Permutation (UnTrans repr)- permutable :: Permutation repr (a->k) k -> repr (a->k) k- perm :: repr (a->k) k -> Permutation repr (a->k) k- noPerm :: Permutation repr k k- permWithDefault :: a -> repr (a->k) k -> Permutation repr (a->k) k- optionalPerm ::- Eitherable repr => Dimapable repr => Permutable repr =>- repr (a->k) k -> Permutation repr (Maybe a -> k) k- optionalPerm = permWithDefault Nothing . dimap Just fromJust--(<&>) ::- Permutable repr =>- Tupable (Permutation repr) =>- repr (a->k) k ->- Permutation repr (b->k) k ->- Permutation repr ((a,b)->k) k-x <&> y = perm x <:> y--(<?&>) ::- Eitherable repr =>- Dimapable repr =>- Permutable repr =>- Tupable (Permutation repr) =>- repr (a->k) k ->- Permutation repr (b->k) k ->- Permutation repr ((Maybe a,b)->k) k-x <?&> y = optionalPerm x <:> y--(<*&>) ::- Eitherable repr =>- Repeatable repr =>- Dimapable repr =>- Permutable repr =>- Tupable (Permutation repr) =>- repr (a->k) k ->- Permutation repr (b->k) k ->- Permutation repr (([a],b)->k) k-x <*&> y = permWithDefault [] (many1 x) <:> y--(<+&>) ::- Eitherable repr =>- Repeatable repr =>- Dimapable repr =>- Permutable repr =>- Tupable (Permutation repr) =>- repr (a->k) k ->- Permutation repr (b->k) k ->- Permutation repr (([a],b)->k) k-x <+&> y = perm (many1 x) <:> y--infixr 4 <&>-infixr 4 <?&>-infixr 4 <*&>-infixr 4 <+&>--{-# INLINE (<&>) #-}-{-# INLINE (<?&>) #-}-{-# INLINE (<*&>) #-}-{-# INLINE (<+&>) #-}
− src/Symantic/Base/Routable.hs
@@ -1,20 +0,0 @@-module Symantic.Base.Routable where--import Data.Eq (Eq)-import Text.Show (Show)--import Symantic.Base.Composable---- * Class 'Routable'-class Routable repr where- (<!>) = trans2 (<!>)- default (<!>) :: Transformable repr => Routable (UnTrans repr) =>- repr a k -> repr b k -> repr (a:!:b) k- (<!>) :: repr a k -> repr b k -> repr (a:!:b) k-infixr 3 <!>---- ** Type (':!:')--- | Like @(,)@ but @infixr@.-data (:!:) a b = a:!:b- deriving (Eq,Show)-infixr 3 :!:
+ src/Symantic/Dityped.hs view
@@ -0,0 +1,7 @@+module Symantic.Dityped+ ( module Symantic.Dityped.Derive+ , module Symantic.Dityped.Lang+ ) where++import Symantic.Dityped.Derive+import Symantic.Dityped.Lang
+ src/Symantic/Dityped/ADT.hs view
@@ -0,0 +1,198 @@+{-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE InstanceSigs #-}+{-# LANGUAGE EmptyCase #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE UndecidableInstances #-}+-- | EOT (Either of Tuples) to/from ADT (Algebraic Data Type).+-- to produce or consume custom ADT with @('<:>')@ and @('<+>')@.+--+-- This is like what is done in @generic-sop@:+-- https://hackage.haskell.org/package/generics-sop-0.5.1.0/docs/src/Generics.SOP.GGP.html#gSumFrom+-- but using directly 'Either' and 'Tuples'+-- instead of passing by the intermediary GADTs @NP@ and @NS@.+module Symantic.Dityped.ADT where++import Data.Either (Either(..))+import Data.Void (Void, absurd)+import Data.Function (($), (.), id, const)+import GHC.Generics as Generics++-- * Type family 'EoT'+-- Return an 'Either' of 'Tuples' from the given 'ADT',+-- matching the nesting occuring when using @('<:>')@ and ('<+>')@+-- and their associativity and precedence,+-- with no parenthesis messing around.+type family EoT (adt :: [[*]]) :: * where+ -- This is 'absurd'+ EoT '[] = Void+ -- There Is No Alternative+ EoT '[ ps ] = Tuples ps+ -- The right associativity of @('<+>')@+ -- puts leaves on 'Left' and nodes on 'Right'+ EoT (ps ': ss) = Either (Tuples ps) (EoT ss)++-- * Type family 'Tuples'+-- | Return the type of 'snd'-nested 2-tuples+-- from the given list of types.+type family Tuples (as :: [*]) :: (r :: *) where+ Tuples '[] = ()+ Tuples '[a] = a+ Tuples (a ': rest) = (a, Tuples rest)++-- * Type 'ADT'+-- | Normalized type-level representation of an Algebraic Data Type.+type ADT (adt :: *) = ListOfRepSums (Rep adt) '[]++-- ** Type family 'ListOfRepSums'+-- | Collect the alternatives in a continuation passing-style.+type family ListOfRepSums (a :: * -> *) (ss :: [[*]]) :: [[*]]+type instance ListOfRepSums (a:+:b) ss = ListOfRepSums a (ListOfRepSums b ss)+-- | Meta-information for datatypes+type instance ListOfRepSums (M1 D _c a) ss = ListOfRepSums a ss+-- | Meta-information for constructors+type instance ListOfRepSums (M1 C _c a) ss = ListOfRepProducts a '[] ': ss+-- | Empty datatypes+type instance ListOfRepSums V1 ss = ss++-- ** Type family 'ListOfRepProducts'+-- | Collect the records in a continuation passing-style.+type family ListOfRepProducts (a :: * -> *) (ps :: [*]) :: [*]+type instance ListOfRepProducts (a:*:b) ps = ListOfRepProducts a (ListOfRepProducts b ps)+-- | Meta-information for record selectors+type instance ListOfRepProducts (M1 S _c a) ps = TypeOfRepField a ': ps+-- | Constructor without fields+type instance ListOfRepProducts U1 ps = ps++-- ** Type family 'TypeOfRepField'+type family TypeOfRepField (a :: * -> *) :: *+type instance TypeOfRepField (K1 _i a) = a++-- * Class 'RepOfEoT'+type RepOfEoT a = RepOfEithers (Rep a) '[]++-- | Morph the 'Either' of 'Tuples' corresponding to an 'ADT'+-- into a constructor of this 'ADT'.+-- This is the reverse of 'eotOfadt'.+adtOfeot :: Generic a => RepOfEoT a => EoT (ADT a) -> a+adtOfeot eot = Generics.to $ repOfEithers @_ @'[] eot id absurd++-- ** Class 'RepOfEithers'+class RepOfEithers (a :: * -> *) ss where+ -- | Parse the 'Either' (list-like) binary tree of 'EoT'+ -- into the @(':+:')@ (balanced) binary tree of 'Rep',+ -- using continuation passing-style for performance.+ repOfEithers ::+ EoT (ListOfRepSums a ss) ->+ -- the 'a' 'Rep' is the current alternative in the 'EoT'+ (a x -> r) ->+ -- the 'a' 'Rep' is a following alternative in the 'EoT'+ (EoT ss -> r) ->+ r+instance (RepOfEithers a (ListOfRepSums b ss), RepOfEithers b ss) => RepOfEithers (a:+:b) ss where+ repOfEithers eot ok ko =+ -- try to parse 'a' on the current 'eot'+ repOfEithers @a @(ListOfRepSums b ss) eot+ (ok . L1)+ (\next ->+ -- parsing 'a' failed+ -- try to parse 'b' on the 'Right' of the current 'eot'+ repOfEithers @b @ss next+ (ok . R1)+ ko -- parsing 'b' failed: backtrack+ )+instance RepOfEithers a ss => RepOfEithers (M1 D c a) ss where+ repOfEithers eot ok = repOfEithers @a @ss eot (ok . M1)+instance RepOfTuples a '[] => RepOfEithers (M1 C c a) (ps ': ss) where+ repOfEithers eot ok ko =+ case eot of+ -- 'EoT' is a leaf, and 'Rep' too: parsing succeeds+ Left ts -> ok $ M1 $ repOfTuples @a @'[] ts const+ -- 'EoT' is a node, but 'Rep' is a leaf: parsing fails+ Right ss -> ko ss+instance RepOfTuples a '[] => RepOfEithers (M1 C c a) '[] where+ repOfEithers eot ok _ko = ok $ M1 $ repOfTuples @_ @'[] eot const+instance RepOfEithers V1 ss where+ repOfEithers eot _ok ko = ko eot++-- ** Class 'RepOfTuples'+class RepOfTuples (a :: * -> *) (xs::[*]) where+ -- | Parse the 'Tuples' (list-like) binary tree of 'EoT'+ -- into the @(':*:')@ (balanced) binary tree of 'Rep',+ -- using continuation passing-style for performance.+ repOfTuples ::+ Tuples (ListOfRepProducts a xs) ->+ (a x -> Tuples xs -> r) -> r+instance (RepOfTuples a (ListOfRepProducts b ps), RepOfTuples b ps) => RepOfTuples (a:*:b) ps where+ repOfTuples ts k =+ -- uncons 'a'+ repOfTuples @a @(ListOfRepProducts b ps) ts+ (\a ts' ->+ -- uncons 'b'+ repOfTuples @b @ps ts'+ (\b -> k (a:*:b)))+instance RepOfField a => RepOfTuples (M1 S c a) (p ': ps) where+ repOfTuples (a, ts) k = k (M1 (repOfField a)) ts+instance RepOfField a => RepOfTuples (M1 S c a) '[] where+ repOfTuples a k = k (M1 (repOfField a)) ()+instance RepOfTuples U1 ps where+ repOfTuples ts k = k U1 ts++-- ** Class 'RepOfField'+class RepOfField (a :: * -> *) where+ repOfField :: TypeOfRepField a -> a x+instance RepOfField (K1 i a) where+ repOfField = K1++-- * Class 'EoTOfRep'+type EoTOfRep a = EithersOfRep (Rep a) '[]++-- | Morph the constructor of an 'ADT'+-- into the corresponding 'Either' of 'Tuples' of this 'ADT'.+-- This is the reverse of 'adtOfeot'.+eotOfadt :: Generic a => EoTOfRep a => a -> EoT (ADT a)+eotOfadt = eithersOfRepL @_ @'[] . Generics.from++-- ** Class 'EithersOfRep'+class EithersOfRep (a :: * -> *) ss where+ eithersOfRepL :: a x -> EoT (ListOfRepSums a ss)+ eithersOfRepR :: EoT ss -> EoT (ListOfRepSums a ss)+instance (EithersOfRep a (ListOfRepSums b ss), EithersOfRep b ss) =>+ EithersOfRep (a:+:b) ss where+ eithersOfRepL = \case+ L1 a -> eithersOfRepL @a @(ListOfRepSums b ss) a+ R1 b -> eithersOfRepR @a @(ListOfRepSums b ss) (eithersOfRepL @b @ss b)+ eithersOfRepR ss = eithersOfRepR @a @(ListOfRepSums b ss) (eithersOfRepR @b @ss ss)+instance EithersOfRep a ss => EithersOfRep (M1 D c a) ss where+ eithersOfRepL (M1 a) = eithersOfRepL @a @ss a+ eithersOfRepR = eithersOfRepR @a @ss+instance TuplesOfRep a '[] => EithersOfRep (M1 C c a) '[] where+ eithersOfRepL (M1 a) = tuplesOfRep @_ @'[] a ()+ eithersOfRepR = absurd+instance TuplesOfRep a '[] => EithersOfRep (M1 C c a) (ps ': ss) where+ eithersOfRepL (M1 a) = Left $ tuplesOfRep @_ @'[] a ()+ eithersOfRepR = Right+instance EithersOfRep V1 ss where+ eithersOfRepL = \case {}+ eithersOfRepR = id++-- ** Class 'TuplesOfRep'+class TuplesOfRep (a :: * -> *) (ps::[*]) where+ tuplesOfRep :: a x -> Tuples ps -> Tuples (ListOfRepProducts a ps)+instance (TuplesOfRep a (ListOfRepProducts b ps), TuplesOfRep b ps) => TuplesOfRep (a:*:b) ps where+ tuplesOfRep (a:*:b) ps =+ tuplesOfRep @a @(ListOfRepProducts b ps) a+ (tuplesOfRep @b @ps b ps)+instance TuplesOfRep U1 ps where+ tuplesOfRep U1 xs = xs+instance FieldOfRep a => TuplesOfRep (M1 S c a) (x ': ps) where+ tuplesOfRep (M1 a) xs = (fieldOfRep a, xs)+instance FieldOfRep a => TuplesOfRep (M1 S c a) '[] where+ tuplesOfRep (M1 a) _xs = fieldOfRep a++-- ** Class 'FieldOfRep'+class FieldOfRep (a :: * -> *) where+ fieldOfRep :: a x -> TypeOfRepField a+instance FieldOfRep (K1 i a) where+ fieldOfRep (K1 a) = a
+ src/Symantic/Dityped/CurryN.hs view
@@ -0,0 +1,40 @@+{-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE DataKinds #-}+module Symantic.Dityped.CurryN where++import Data.Function (($), (.))++import Symantic.Dityped.ADT (Tuples)++-- * Class 'CurryN'+-- | Produce and consume 'Tuples'.+-- Not actually useful for the Generic side of this module,+-- but related through the use of 'Tuples'.+class CurryN args where+ -- Like 'curry' but for an arbitrary number of nested 2-tuples.+ curryN :: (Tuples args -> res) -> args-..->res+ -- Like 'uncurry' but for an arbitrary number of nested 2-tuples.+ uncurryN :: (args-..->res) -> Tuples args -> res+ -- Like 'fmap' on @('->')@ but for an arbitrary number of arguments.+ mapresultN :: (a->b) -> (args-..->a) -> args-..->b+instance CurryN '[a] where+ curryN = ($)+ uncurryN = ($)+ mapresultN = (.)+instance CurryN (b ': as) => CurryN (a ': b ': as) where+ curryN f x = curryN @(b ': as) (\xs -> f (x, xs))+ uncurryN f (x, xs) = uncurryN @(b ': as) (f x) xs+ mapresultN f as2r = mapresultN @(b ': as) f . as2r++-- ** Type family ('-..->')+type family (args :: [*]) -..-> (r :: *) :: * where+ '[] -..-> r = r+ (a : args) -..-> r = a -> args -..-> r+-- ** Type family 'Args'+type family Args (f :: *) :: [*] where+ Args (a -> r) = a : Args r+ Args r = '[]+-- ** Type family 'Result'+type family Result (as :: *) :: * where+ Result (a -> r) = Result r+ Result r = r
+ src/Symantic/Dityped/Derive.hs view
@@ -0,0 +1,87 @@+{-# LANGUAGE ConstraintKinds #-} -- For type class synonyms+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE DefaultSignatures #-} -- For adding LiftDerived* constraints+module Symantic.Dityped.Derive where++import Data.Function ((.))+import Data.Kind (Type)++-- * Type family 'Derived'+-- | The representation that @(repr)@ derives to.+type family Derived (repr :: Type -> Type -> Type) :: Type -> Type -> Type++-- * Class 'Derivable'+-- | Derivable an interpreter to a another interpreter+-- determined by the 'Derived' open type family.+-- This is mostly useful when running the interpreter stack,+-- but also when going back from an initial encoding to a final one.+--+-- Note that 'derive' and 'liftDerived' are not necessarily reciprocical functions.+class Derivable repr where+ derive :: repr a ka -> Derived repr a ka++-- * Class 'LiftDerived'+-- | Lift the 'Derived' interpreter of an interpreter, to that interpreter.+-- This is mostly useful to give default values to class methods+-- in order to skip their definition for interpreters+-- where 'liftDerived' can already apply the right semantic.+--+-- Note that 'derive' and 'liftDerived' are not necessarily reciprocical functions.+class LiftDerived repr where+ liftDerived :: Derived repr a ka -> repr a ka++-- * Class 'LiftDerived1'+-- | Convenient wrapper of 'derive' and 'liftDerived' for functions with a single argument.+class LiftDerived1 repr where+ liftDerived1 ::+ (Derived repr a ka -> Derived repr b kb) ->+ repr a ka -> repr b kb+ liftDerived1 f = liftDerived . f . derive+ default liftDerived1 ::+ LiftDerived repr => Derivable repr =>+ (Derived repr a ka -> Derived repr b kb) ->+ repr a ka -> repr b kb++-- * Class 'LiftDerived2'+-- | Convenient wrapper of 'derive' and 'liftDerived' for functions with two arguments.+class LiftDerived2 repr where+ liftDerived2 ::+ (Derived repr a ka -> Derived repr b kb -> Derived repr c kc) ->+ repr a ka -> repr b kb -> repr c kc+ liftDerived2 f a b = liftDerived (f (derive a) (derive b))+ default liftDerived2 ::+ LiftDerived repr => Derivable repr =>+ (Derived repr a ka -> Derived repr b kb -> Derived repr c kc) ->+ repr a ka -> repr b kb -> repr c kc++-- * Class 'LiftDerived3'+-- | Convenient wrapper of 'derive' and 'liftDerived' for functions with three arguments.+class LiftDerived3 repr where+ liftDerived3 ::+ (Derived repr a ka -> Derived repr b kb -> Derived repr c kc -> Derived repr d kd) ->+ repr a ka -> repr b kb -> repr c kc -> repr d kd+ liftDerived3 f a b c = liftDerived (f (derive a) (derive b) (derive c))+ default liftDerived3 ::+ LiftDerived repr => Derivable repr =>+ (Derived repr a ka -> Derived repr b kb -> Derived repr c kc -> Derived repr d kd) ->+ repr a ka -> repr b kb -> repr c kc -> repr d kd++-- * Class 'LiftDerived4'+-- | Convenient wrapper of 'derive' and 'liftDerived' for functions with three arguments.+class LiftDerived4 repr where+ liftDerived4 ::+ (Derived repr a ka -> Derived repr b kb -> Derived repr c kc -> Derived repr d kd -> Derived repr e ke) ->+ repr a ka -> repr b kb -> repr c kc -> repr d kd -> repr e ke+ liftDerived4 f a b c d = liftDerived (f (derive a) (derive b) (derive c) (derive d))+ default liftDerived4 ::+ LiftDerived repr => Derivable repr =>+ (Derived repr a ka -> Derived repr b kb -> Derived repr c kc -> Derived repr d kd -> Derived repr e ke) ->+ repr a ka -> repr b kb -> repr c kc -> repr d kd -> repr e ke++-- * Type synonyms @FromDerived*@+-- | Convenient type synonym for using 'liftDerived' on symantic class @(sym)@.+type FromDerived sym repr = ( LiftDerived repr, sym (Derived repr) )+type FromDerived1 sym repr = ( LiftDerived1 repr, sym (Derived repr) )+type FromDerived2 sym repr = ( LiftDerived2 repr, sym (Derived repr) )+type FromDerived3 sym repr = ( LiftDerived3 repr, sym (Derived repr) )+type FromDerived4 sym repr = ( LiftDerived4 repr, sym (Derived repr) )
+ src/Symantic/Dityped/Lang.hs view
@@ -0,0 +1,246 @@+{-# LANGUAGE TypeFamilyDependencies #-} -- For Permutation+{-# LANGUAGE UndecidableInstances #-} -- For Permutation+module Symantic.Dityped.Lang where++import Data.Either (Either)+import Data.Eq (Eq)+import Data.Function ((.))+import Data.Maybe (Maybe(..), fromJust)+import Data.Proxy (Proxy(..))+import GHC.Generics (Generic)+import Text.Show (Show)++import Symantic.Dityped.ADT+import Symantic.Dityped.CurryN+import Symantic.Dityped.Derive++-- * Class 'Composable'+class Composable repr where+ (<.>) :: repr a b -> repr b c -> repr a c+ (<.>) = liftDerived2 (<.>)+ default (<.>) ::+ FromDerived2 Composable repr =>+ repr a b -> repr b c -> repr a c+infixr 4 <.>++-- ** Class 'Constant'+class Constant repr where+ constant :: a -> repr (a -> k) k+ constant = liftDerived . constant+ default constant ::+ FromDerived Constant repr =>+ a -> repr (a -> k) k++-- * Class 'Dicurryable'+class Dicurryable repr where+ dicurry ::+ CurryN args =>+ proxy args ->+ (args-..->r) -> -- construction+ (r->Tuples args) -> -- destruction+ repr (args-..->k) k ->+ repr (r->k) k+ dicurry args constr destr = liftDerived1 (dicurry args constr destr)+ default dicurry ::+ FromDerived1 Dicurryable repr =>+ CurryN args =>+ proxy args ->+ (args-..->r) ->+ (r->Tuples args) ->+ repr (args-..->k) k ->+ repr (r->k) k++construct ::+ forall args a k repr.+ Dicurryable repr =>+ Generic a =>+ EoTOfRep a =>+ CurryN args =>+ Tuples args ~ EoT (ADT a) =>+ (args ~ Args (args-..->a)) =>+ (args-..->a) ->+ repr (args-..->k) k ->+ repr (a -> k) k+construct f = dicurry (Proxy::Proxy args) f eotOfadt++-- * Class 'Dimapable'+class Dimapable repr where+ dimap :: (a->b) -> (b->a) -> repr (a->k) k -> repr (b->k) k+ dimap a2b b2a = liftDerived1 (dimap a2b b2a)+ default dimap ::+ FromDerived1 Dimapable repr =>+ (a->b) -> (b->a) -> repr (a->k) k -> repr (b->k) k++-- * Class 'Eitherable'+class Eitherable repr where+ (<+>) :: repr (a->k) k -> repr (b->k) k -> repr (Either a b->k) k+ (<+>) = liftDerived2 (<+>)+ default (<+>) ::+ FromDerived2 Eitherable repr =>+ repr (a->k) k -> repr (b->k) k -> repr (Either a b -> k) k+-- NOTE: yes infixr, not infixl like <|>,+-- in order to run left-most checks first.+infixr 3 <+>++-- | @('adt' @@SomeADT some_expr)@+-- wrap\/unwrap @(some_expr)@ input\/output value+-- to\/from the Algebraic Data Type @(SomeADT)@.+-- @(SomeADT)@ must have a 'Generic' instance+-- (using the @DeriveGeneric@ language extension to GHC).+adt ::+ forall adt repr k.+ Dimapable repr =>+ Generic adt =>+ RepOfEoT adt =>+ EoTOfRep adt =>+ repr (EoT (ADT adt) -> k) k ->+ repr (adt -> k) k+adt = dimap adtOfeot eotOfadt++-- ** Class 'Emptyable'+class Emptyable repr where+ empty :: repr k k+ empty = liftDerived empty+ default empty ::+ FromDerived Emptyable repr =>+ repr k k++-- ** Class 'Optionable'+class Optionable repr where+ option :: repr k k -> repr k k+ optional :: repr (a->k) k -> repr (Maybe a->k) k+ option = liftDerived1 option+ optional = liftDerived1 optional+ default option ::+ FromDerived1 Optionable repr =>+ repr k k -> repr k k+ default optional ::+ FromDerived1 Optionable repr =>+ repr (a->k) k -> repr (Maybe a->k) k++-- * Class 'Permutable'+class Permutable repr where+ -- Use @TypeFamilyDependencies@ to help type-inference infer @(repr)@.+ type Permutation (repr:: * -> * -> *) = (r :: * -> * -> *) | r -> repr+ type Permutation repr = Permutation (Derived repr)+ permutable :: Permutation repr (a->k) k -> repr (a->k) k+ perm :: repr (a->k) k -> Permutation repr (a->k) k+ noPerm :: Permutation repr k k+ permWithDefault :: a -> repr (a->k) k -> Permutation repr (a->k) k+ optionalPerm ::+ Eitherable repr => Dimapable repr => Permutable repr =>+ repr (a->k) k -> Permutation repr (Maybe a -> k) k+ optionalPerm = permWithDefault Nothing . dimap Just fromJust++(<&>) ::+ Permutable repr =>+ Tupable (Permutation repr) =>+ repr (a->k) k ->+ Permutation repr (b->k) k ->+ Permutation repr ((a,b)->k) k+x <&> y = perm x <:> y++(<?&>) ::+ Eitherable repr =>+ Dimapable repr =>+ Permutable repr =>+ Tupable (Permutation repr) =>+ repr (a->k) k ->+ Permutation repr (b->k) k ->+ Permutation repr ((Maybe a,b)->k) k+x <?&> y = optionalPerm x <:> y++(<*&>) ::+ Eitherable repr =>+ Repeatable repr =>+ Dimapable repr =>+ Permutable repr =>+ Tupable (Permutation repr) =>+ repr (a->k) k ->+ Permutation repr (b->k) k ->+ Permutation repr (([a],b)->k) k+x <*&> y = permWithDefault [] (many1 x) <:> y++(<+&>) ::+ Eitherable repr =>+ Repeatable repr =>+ Dimapable repr =>+ Permutable repr =>+ Tupable (Permutation repr) =>+ repr (a->k) k ->+ Permutation repr (b->k) k ->+ Permutation repr (([a],b)->k) k+x <+&> y = perm (many1 x) <:> y++infixr 4 <&>+infixr 4 <?&>+infixr 4 <*&>+infixr 4 <+&>++{-# INLINE (<&>) #-}+{-# INLINE (<?&>) #-}+{-# INLINE (<*&>) #-}+{-# INLINE (<+&>) #-}++-- * Class 'Repeatable'+class Repeatable repr where+ many0 :: repr (a->k) k -> repr ([a]->k) k+ many1 :: repr (a->k) k -> repr ([a]->k) k+ many0 = liftDerived1 many0+ many1 = liftDerived1 many1+ default many0 ::+ FromDerived1 Repeatable repr =>+ repr (a->k) k -> repr ([a]->k) k+ default many1 ::+ FromDerived1 Repeatable repr =>+ repr (a->k) k -> repr ([a]->k) k++-- * Class 'Routable'+class Routable repr where+ (<!>) :: repr a k -> repr b k -> repr (a:!:b) k+ (<!>) = liftDerived2 (<!>)+ default (<!>) ::+ FromDerived2 Routable repr =>+ repr a k -> repr b k -> repr (a:!:b) k+infixr 3 <!>++-- ** Type (':!:')+-- | Like @(,)@ but @infixr@.+-- Mostly useful for clarity when using 'Routable'.+data (:!:) a b = a:!:b+ deriving (Eq, Show)+infixr 3 :!:++-- * Class 'Substractable'+class Substractable repr where+ (<->) :: repr a k -> repr k' k' -> repr a k+ (<->) = liftDerived2 (<->)+ default (<->) ::+ FromDerived2 Substractable repr =>+ repr a k -> repr k' k' -> repr a k+infixr 3 <->++-- * Class 'Tupable'+class Tupable repr where+ (<:>) :: repr (a->k) k -> repr (b->k) k -> repr ((a,b)->k) k+ (<:>) = liftDerived2 (<:>)+ default (<:>) ::+ FromDerived2 Tupable repr =>+ repr (a->k) k -> repr (b->k) k -> repr ((a,b)->k) k+infixr 4 <:>++-- ** Class 'Unitable'+class Unitable repr where+ unit :: repr (() -> k) k+ unit = liftDerived unit+ default unit ::+ FromDerived Unitable repr =>+ repr (() -> k) k++-- * Class 'Voidable'+class Voidable repr where+ default void ::+ FromDerived1 Voidable repr =>+ a -> repr (a -> b) k -> repr b k+ void :: a -> repr (a -> b) k -> repr b k+ void a = liftDerived1 (void a)
+ src/Symantic/Typed.hs view
@@ -0,0 +1,17 @@+module Symantic.Typed+ ( module Symantic.Typed.Data+ , module Symantic.Typed.Derive+ , module Symantic.Typed.Lang+ , module Symantic.Typed.ObserveSharing+ , module Symantic.Typed.Optimize+ , module Symantic.Typed.Reify+ , module Symantic.Typed.View+ ) where++import Symantic.Typed.Data+import Symantic.Typed.Derive+import Symantic.Typed.Lang+import Symantic.Typed.ObserveSharing+import Symantic.Typed.Optimize+import Symantic.Typed.Reify+import Symantic.Typed.View
+ src/Symantic/Typed/Data.hs view
@@ -0,0 +1,211 @@+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE ViewPatterns #-}+module Symantic.Typed.Data where++import Data.Bool (Bool)+import Data.Either (Either)+import Data.Kind (Constraint, Type)+import Data.Maybe (Maybe)+import Type.Reflection (Typeable, (:~~:)(..), eqTypeRep, typeRep)+import qualified Data.Eq as Eq+import qualified Data.Maybe as Maybe+import qualified Data.Function as Fun++import Symantic.Typed.Lang+import Symantic.Typed.Derive++-- * Type 'SomeData'+data SomeData repr a =+ forall able.+ ( Derivable (Data able repr)+ , Typeable able+ ) => SomeData (Data able repr a)++type instance Derived (SomeData repr) = repr+instance Derivable (SomeData repr) where+ derive (SomeData x) = derive x++-- ** Type 'TypedRepr'+type TypedRepr = Type -> Type++-- ** Type 'Data'+-- TODO: neither data families nor data instances+-- can have phantom roles with GHC-9's RoleAnnotations,+-- hence 'Data.Coerce.coerce' cannot be used on them for now.+-- https://gitlab.haskell.org/ghc/ghc/-/issues/8177+-- https://gitlab.haskell.org/ghc/ghc/-/wikis/roles#proposal-roles-for-type-families+data family Data+ (able :: TypedRepr -> Constraint)+ :: TypedRepr -> TypedRepr+type instance Derived (Data able repr) = repr++-- | Convenient utility to pattern-match a 'SomeData'.+pattern Data :: Typeable able => Data able repr a -> SomeData repr a+pattern Data x <- (unSomeData -> Maybe.Just x)++-- | @(unSomeData c :: 'Maybe' ('Data' able repr a))@+-- extract the data-constructor from the given 'SomeData'+-- iif. it belongs to the @('Data' able repr a)@ data-instance.+unSomeData ::+ forall able repr a.+ Typeable able =>+ SomeData repr a -> Maybe (Data able repr a)+unSomeData (SomeData (c::Data c repr a)) =+ case typeRep @able `eqTypeRep` typeRep @c of+ Maybe.Just HRefl -> Maybe.Just c+ Maybe.Nothing -> Maybe.Nothing++-- Abstractable+data instance Data Abstractable repr a where+ (:@) :: SomeData repr (a->b) -> SomeData repr a -> Data Abstractable repr b+ Lam :: (SomeData repr a -> SomeData repr b) -> Data Abstractable repr (a->b)+ Lam1 :: (SomeData repr a -> SomeData repr b) -> Data Abstractable repr (a->b)+ Var :: repr a -> Data Abstractable repr a+ -- FIXME: add constructors+instance+ ( Abstractable repr+ ) => Derivable (Data Abstractable repr) where+ derive = \case+ f :@ x -> derive f .@ derive x+ Lam f -> lam (\x -> derive (f (SomeData (Var x))))+ Lam1 f -> lam1 (\x -> derive (f (SomeData (Var x))))+ Var x -> var x+instance+ ( Abstractable repr+ ) => Abstractable (SomeData repr) where+ f .@ x = SomeData (f :@ x)+ lam f = SomeData (Lam f)+ lam1 f = SomeData (Lam1 f)+ var = Fun.id+ ($) = lam1 (\f -> lam1 (\x -> f .@ x))+ (.) = lam1 (\f -> lam1 (\g -> lam1 (\x -> f .@ (g .@ x))))+ const = lam1 (\x -> lam1 (\_y -> x))+ flip = lam1 (\f -> lam1 (\x -> lam1 (\y -> f .@ y .@ x)))+ id = lam1 (\x -> x)++-- Anythingable+data instance Data Anythingable repr a where+ Anything :: repr a -> Data Anythingable repr a+instance+ ( Anythingable repr+ ) =>+ Derivable (Data Anythingable repr) where+ derive = \case+ Anything x -> anything x+instance Anythingable (SomeData repr)+instance Anythingable (Data Anythingable repr)++-- Bottomable+data instance Data Bottomable repr a where+ Bottom :: Data Bottomable repr a+instance Bottomable repr => Derivable (Data Bottomable repr) where+ derive Bottom{} = bottom++-- Constantable+data instance Data (Constantable c) repr a where+ Constant :: {-Typeable c =>-} c -> Data (Constantable c) repr c+instance Constantable c repr => Derivable (Data (Constantable c) repr) where+ derive = \case+ Constant x -> constant x+instance+ ( Constantable c repr+ , Typeable c+ ) => Constantable c (SomeData repr) where+ constant c = SomeData (Constant c)+instance {-Typeable c =>-} Constantable c (Data (Constantable c) repr) where+ constant = Constant++-- Eitherable+data instance Data Eitherable repr a where+ Left :: Data Eitherable repr (l -> Either l r)+ Right :: Data Eitherable repr (r -> Either l r)+instance Eitherable repr => Derivable (Data Eitherable repr) where+ derive = \case+ Left -> left+ Right -> right+instance+ ( Eitherable repr+ ) => Eitherable (SomeData repr) where+ left = SomeData Left+ right = SomeData Right+instance Eitherable (Data Eitherable repr) where+ left = Left+ right = Right++-- Equalable+data instance Data Equalable repr a where+ Equal :: Eq.Eq a => Data Equalable repr (a -> a -> Bool)+instance Equalable repr => Derivable (Data Equalable repr) where+ derive = \case+ Equal -> equal+instance+ ( Equalable repr+ ) => Equalable (SomeData repr) where+ equal = SomeData Equal+instance Equalable (Data Equalable repr) where+ equal = Equal++-- IfThenElseable+data instance Data IfThenElseable repr a where+ IfThenElse ::+ SomeData repr Bool ->+ SomeData repr a ->+ SomeData repr a ->+ Data IfThenElseable repr a+instance IfThenElseable repr => Derivable (Data IfThenElseable repr) where+ derive = \case+ IfThenElse test ok ko -> ifThenElse (derive test) (derive ok) (derive ko)+instance+ ( IfThenElseable repr+ ) => IfThenElseable (SomeData repr) where+ ifThenElse test ok ko = SomeData (IfThenElse test ok ko)+instance IfThenElseable repr => IfThenElseable (Data IfThenElseable repr) where+ ifThenElse test ok ko = IfThenElse (SomeData test) (SomeData ok) (SomeData ko)++-- Listable+data instance Data Listable repr a where+ Cons :: Data Listable repr (a -> [a] -> [a])+ Nil :: Data Listable repr [a]+infixr 4 `Cons`+instance Listable repr => Derivable (Data Listable repr) where+ derive = \case+ Cons -> cons+ Nil -> nil+instance+ ( Listable repr+ ) => Listable (SomeData repr) where+ cons = SomeData Cons+ nil = SomeData Nil+instance Listable (Data Listable repr) where+ cons = Cons+ nil = Nil++-- Maybeable+data instance Data Maybeable repr a where+ Nothing :: Data Maybeable repr (Maybe a)+ Just :: Data Maybeable repr (a -> Maybe a)+instance Maybeable repr => Derivable (Data Maybeable repr) where+ derive = \case+ Nothing -> nothing+ Just -> just+instance+ ( Maybeable repr+ ) => Maybeable (SomeData repr) where+ nothing = SomeData Nothing+ just = SomeData Just+instance Maybeable (Data Maybeable repr) where+ nothing = Nothing+ just = Just
+ src/Symantic/Typed/Derive.hs view
@@ -0,0 +1,87 @@+{-# LANGUAGE ConstraintKinds #-} -- For type class synonyms+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE DefaultSignatures #-} -- For adding LiftDerived* constraints+module Symantic.Typed.Derive where++import Data.Function ((.))+import Data.Kind (Type)++-- * Type family 'Derived'+-- | The representation that @(repr)@ derives to.+type family Derived (repr :: Type -> Type) :: Type -> Type++-- * Class 'Derivable'+-- | Derivable an interpreter to a another interpreter+-- determined by the 'Derived' open type family.+-- This is mostly useful when running the interpreter stack,+-- but also when going back from an initial encoding to a final one.+--+-- Note that 'derive' and 'liftDerived' are not necessarily reciprocical functions.+class Derivable repr where+ derive :: repr a -> Derived repr a++-- * Class 'LiftDerived'+-- | Lift the 'Derived' interpreter of an interpreter, to that interpreter.+-- This is mostly useful to give default values to class methods+-- in order to skip their definition for interpreters+-- where 'liftDerived' can already apply the right semantic.+--+-- Note that 'derive' and 'liftDerived' are not necessarily reciprocical functions.+class LiftDerived repr where+ liftDerived :: Derived repr a -> repr a++-- * Class 'LiftDerived1'+-- | Convenient wrapper of 'derive' and 'liftDerived' for functions with a single argument.+class LiftDerived1 repr where+ liftDerived1 ::+ (Derived repr a -> Derived repr b) ->+ repr a -> repr b+ liftDerived1 f = liftDerived . f . derive+ default liftDerived1 ::+ LiftDerived repr => Derivable repr =>+ (Derived repr a -> Derived repr b) ->+ repr a -> repr b++-- * Class 'LiftDerived2'+-- | Convenient wrapper of 'derive' and 'liftDerived' for functions with two arguments.+class LiftDerived2 repr where+ liftDerived2 ::+ (Derived repr a -> Derived repr b -> Derived repr c) ->+ repr a -> repr b -> repr c+ liftDerived2 f a b = liftDerived (f (derive a) (derive b))+ default liftDerived2 ::+ LiftDerived repr => Derivable repr =>+ (Derived repr a -> Derived repr b -> Derived repr c) ->+ repr a -> repr b -> repr c++-- * Class 'LiftDerived3'+-- | Convenient wrapper of 'derive' and 'liftDerived' for functions with three arguments.+class LiftDerived3 repr where+ liftDerived3 ::+ (Derived repr a -> Derived repr b -> Derived repr c -> Derived repr d) ->+ repr a -> repr b -> repr c -> repr d+ liftDerived3 f a b c = liftDerived (f (derive a) (derive b) (derive c))+ default liftDerived3 ::+ LiftDerived repr => Derivable repr =>+ (Derived repr a -> Derived repr b -> Derived repr c -> Derived repr d) ->+ repr a -> repr b -> repr c -> repr d++-- * Class 'LiftDerived4'+-- | Convenient wrapper of 'derive' and 'liftDerived' for functions with three arguments.+class LiftDerived4 repr where+ liftDerived4 ::+ (Derived repr a -> Derived repr b -> Derived repr c -> Derived repr d -> Derived repr e) ->+ repr a -> repr b -> repr c -> repr d -> repr e+ liftDerived4 f a b c d = liftDerived (f (derive a) (derive b) (derive c) (derive d))+ default liftDerived4 ::+ LiftDerived repr => Derivable repr =>+ (Derived repr a -> Derived repr b -> Derived repr c -> Derived repr d -> Derived repr e) ->+ repr a -> repr b -> repr c -> repr d -> repr e++-- * Type synonyms @FromDerived*@+-- | Convenient type synonym for using 'liftDerived' on symantic class @(sym)@.+type FromDerived sym repr = ( LiftDerived repr, sym (Derived repr) )+type FromDerived1 sym repr = ( LiftDerived1 repr, sym (Derived repr) )+type FromDerived2 sym repr = ( LiftDerived2 repr, sym (Derived repr) )+type FromDerived3 sym repr = ( LiftDerived3 repr, sym (Derived repr) )+type FromDerived4 sym repr = ( LiftDerived4 repr, sym (Derived repr) )
+ src/Symantic/Typed/Fixity.hs view
@@ -0,0 +1,115 @@+module Symantic.Typed.Fixity where++import Data.Bool+import Data.Eq (Eq(..))+import Data.Function ((.))+import Data.Int (Int)+import Data.Maybe (Maybe(..))+import Data.Ord (Ord(..))+import Data.Semigroup+import Data.String (String, IsString(..))+import Text.Show (Show(..))++-- * Type 'Fixity'+data Fixity+ = Fixity1 Unifix+ | Fixity2 Infix+ deriving (Eq, Show)++-- ** Type 'Unifix'+data Unifix+ = Prefix { unifix_precedence :: Precedence }+ | Postfix { unifix_precedence :: Precedence }+ deriving (Eq, Show)++-- ** Type 'Infix'+data Infix+ = Infix+ { infix_associativity :: Maybe Associativity+ , infix_precedence :: Precedence+ } deriving (Eq, Show)++infixL :: Precedence -> Infix+infixL = Infix (Just AssocL)++infixR :: Precedence -> Infix+infixR = Infix (Just AssocR)++infixB :: Side -> Precedence -> Infix+infixB = Infix . Just . AssocB++infixN :: Precedence -> Infix+infixN = Infix Nothing++infixN0 :: Infix+infixN0 = infixN 0++infixN5 :: Infix+infixN5 = infixN 5++-- | Given 'Precedence' and 'Associativity' of its parent operator,+-- and the operand 'Side' it is in,+-- return whether an 'Infix' operator+-- needs to be enclosed by a 'Pair'.+isPairNeeded :: (Infix, Side) -> Infix -> Bool+isPairNeeded (po, lr) op =+ infix_precedence op < infix_precedence po+ || infix_precedence op == infix_precedence po+ && not associate+ where+ associate =+ case (lr, infix_associativity po) of+ (_, Just AssocB{}) -> True+ (SideL, Just AssocL) -> True+ (SideR, Just AssocR) -> True+ _ -> False++-- | If 'isPairNeeded' is 'True',+-- enclose the given 'IsString' by given 'Pair',+-- otherwise returns the same 'IsString'.+pairIfNeeded ::+ Semigroup s => IsString s =>+ Pair -> (Infix, Side) -> Infix ->+ s -> s+pairIfNeeded (o,c) po op s =+ if isPairNeeded po op+ then fromString o <> s <> fromString c+ else s++-- * Type 'Precedence'+type Precedence = Int++-- ** Class 'PrecedenceOf'+class PrecedenceOf a where+ precedence :: a -> Precedence+instance PrecedenceOf Fixity where+ precedence (Fixity1 uni) = precedence uni+ precedence (Fixity2 inf) = precedence inf+instance PrecedenceOf Unifix where+ precedence = unifix_precedence+instance PrecedenceOf Infix where+ precedence = infix_precedence++-- * Type 'Associativity'+data Associativity+ = AssocL -- ^ Associate to the left: @a ¹ b ² c == (a ¹ b) ² c@+ | AssocR -- ^ Associate to the right: @a ¹ b ² c == a ¹ (b ² c)@+ | AssocB Side -- ^ Associate to both sides, but to 'Side' when reading.+ deriving (Eq, Show)++-- ** Type 'Side'+data Side+ = SideL -- ^ Left+ | SideR -- ^ Right+ deriving (Eq, Show)++-- ** Type 'Pair'+type Pair = (String, String)+pairAngle :: Pair+pairBrace :: Pair+pairBracket :: Pair+pairParen :: Pair+pairAngle = ("<",">")+pairBrace = ("{","}")+pairBracket = ("[","]")+pairParen = ("(",")")
+ src/Symantic/Typed/Lang.hs view
@@ -0,0 +1,154 @@+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE NoMonomorphismRestriction #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE NoImplicitPrelude #-}+module Symantic.Typed.Lang where++import Data.Char (Char)+import Data.Bool (Bool(..))+import Data.Either (Either(..))+import Data.Eq (Eq)+import Data.Maybe (Maybe(..))+import qualified Data.Function as Fun++import Symantic.Typed.Derive++-- * Class 'Abstractable'+class Abstractable repr where+ -- | Application, aka. unabstract.+ (.@) :: repr (a->b) -> repr a -> repr b; infixl 9 .@+ -- | Lambda term abstraction, in HOAS (Higher-Order Abstract Syntax) style.+ lam :: (repr a -> repr b) -> repr (a->b)+ -- | Like 'lam' but whose argument is used only once,+ -- hence safe to beta-reduce (inline) without duplicating work.+ lam1 :: (repr a -> repr b) -> repr (a->b)+ const :: repr (a -> b -> a)+ flip :: repr ((a -> b -> c) -> b -> a -> c)+ id :: repr (a->a)+ (.) :: repr ((b->c) -> (a->b) -> a -> c); infixr 9 .+ ($) :: repr ((a->b) -> a -> b); infixr 0 $+ var :: repr a -> repr a+ (.@) = liftDerived2 (.@)+ lam f = liftDerived (lam (derive Fun.. f Fun.. liftDerived))+ lam1 f = liftDerived (lam1 (derive Fun.. f Fun.. liftDerived))+ const = liftDerived const+ flip = liftDerived flip+ id = liftDerived id+ (.) = liftDerived (.)+ ($) = liftDerived ($)+ var = liftDerived1 var+ default (.@) ::+ FromDerived2 Abstractable repr =>+ repr (a->b) -> repr a -> repr b+ default lam ::+ FromDerived Abstractable repr => Derivable repr =>+ (repr a -> repr b) -> repr (a->b)+ default lam1 ::+ FromDerived Abstractable repr => Derivable repr =>+ (repr a -> repr b) -> repr (a->b)+ default const ::+ FromDerived Abstractable repr =>+ repr (a -> b -> a)+ default flip ::+ FromDerived Abstractable repr =>+ repr ((a -> b -> c) -> b -> a -> c)+ default id ::+ FromDerived Abstractable repr =>+ repr (a->a)+ default (.) ::+ FromDerived Abstractable repr =>+ repr ((b->c) -> (a->b) -> a -> c)+ default ($) ::+ FromDerived Abstractable repr =>+ repr ((a->b) -> a -> b)+ default var ::+ FromDerived1 Abstractable repr =>+ repr a -> repr a++-- * Class 'Anythingable'+class Anythingable repr where+ anything :: repr a -> repr a+ anything = Fun.id++-- * Class 'Bottomable'+class Bottomable repr where+ bottom :: repr a++-- * Class 'Constantable'+class Constantable c repr where+ constant :: c -> repr c+ constant = liftDerived Fun.. constant+ default constant ::+ FromDerived (Constantable c) repr =>+ c -> repr c++bool :: Constantable Bool repr => Bool -> repr Bool+bool = constant @Bool+char :: Constantable Char repr => Char -> repr Char+char = constant @Char+unit :: Constantable () repr => repr ()+unit = constant @() ()++-- * Class 'Eitherable'+class Eitherable repr where+ left :: repr (l -> Either l r)+ right :: repr (r -> Either l r)+ left = liftDerived left+ right = liftDerived right+ default left ::+ FromDerived Eitherable repr =>+ repr (l -> Either l r)+ default right ::+ FromDerived Eitherable repr =>+ repr (r -> Either l r)++-- * Class 'Equalable'+class Equalable repr where+ equal :: Eq a => repr (a -> a -> Bool)+ equal = liftDerived equal+ default equal ::+ FromDerived Equalable repr =>+ Eq a => repr (a -> a -> Bool)++infix 4 `equal`, ==+(==) :: (Abstractable repr, Equalable repr, Eq a) => repr (a -> a -> Bool)+(==) = lam (\x -> lam (\y -> equal .@ x .@ y))++-- * Class 'IfThenElseable'+class IfThenElseable repr where+ ifThenElse :: repr Bool -> repr a -> repr a -> repr a+ ifThenElse = liftDerived3 ifThenElse+ default ifThenElse ::+ FromDerived3 IfThenElseable repr =>+ repr Bool -> repr a -> repr a -> repr a++-- * Class 'Listable'+class Listable repr where+ cons :: repr (a -> [a] -> [a])+ nil :: repr [a]+ cons = liftDerived cons+ nil = liftDerived nil+ default cons ::+ FromDerived Listable repr =>+ repr (a -> [a] -> [a])+ default nil ::+ FromDerived Listable repr =>+ repr [a]++-- * Class 'Maybeable'+class Maybeable repr where+ nothing :: repr (Maybe a)+ just :: repr (a -> Maybe a)+ nothing = liftDerived nothing+ just = liftDerived just+ default nothing ::+ FromDerived Maybeable repr =>+ repr (Maybe a)+ default just ::+ FromDerived Maybeable repr =>+ repr (a -> Maybe a)
+ src/Symantic/Typed/ObserveSharing.hs view
@@ -0,0 +1,330 @@+{-# LANGUAGE AllowAmbiguousTypes #-} -- For ShowLetName+{-# LANGUAGE BangPatterns #-} -- For makeSharingName+{-# LANGUAGE DataKinds #-} -- For ShowLetName+{-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE ExistentialQuantification #-} -- For SharingName+-- {-# LANGUAGE MagicHash #-} -- For unsafeCoerce#+module Symantic.Typed.ObserveSharing where++import Control.Applicative (Applicative(..))+import Control.Monad (Monad(..))+import Data.Bool (Bool(..))+import Data.Eq (Eq(..))+import Data.Foldable (foldMap)+import Data.Function (($), (.))+import Data.Functor ((<$>))+import Data.Functor.Compose (Compose(..))+import Data.HashMap.Strict (HashMap)+import Data.HashSet (HashSet)+import Data.Hashable (Hashable, hashWithSalt, hash)+import Data.Int (Int)+import Data.Maybe (Maybe(..), isNothing)+import Data.Monoid (Monoid(..))+import Data.Ord (Ord(..))+import Data.String (String)+-- import GHC.Exts (Int(..))+-- import GHC.Prim (unsafeCoerce#)+import GHC.StableName (StableName(..), makeStableName, hashStableName, eqStableName)+-- import Numeric (showHex)+import Prelude ((+), error)+import System.IO (IO)+import System.IO.Unsafe (unsafePerformIO)+import Text.Show (Show(..))+import qualified Control.Monad.Trans.Class as MT+import qualified Control.Monad.Trans.Reader as MT+import qualified Control.Monad.Trans.State as MT+import qualified Control.Monad.Trans.Writer as MT+import qualified Data.HashMap.Strict as HM+import qualified Data.HashSet as HS++import Symantic.Typed.Derive++-- * Class 'Letable'+-- | This class is not for end-users like usual symantic operators,+-- here 'shareable' and 'ref' are introduced by 'observeSharing'.+class Letable letName repr where+ -- | @('ref' isRec letName)@ is a reference to @(letName)@.+ -- @(isRec)@ is 'True' iif. this 'ref'erence is recursive,+ -- ie. is reachable within its 'shareable' definition.+ ref :: Bool -> letName -> repr a+ ref isRec n = liftDerived (ref isRec n)+ default ref ::+ FromDerived (Letable letName) repr =>+ Bool -> letName -> repr a++ -- | @('shareable' letName x)@ let-binds @(letName)@ to be equal to @(x)@.+ shareable :: letName -> repr a -> repr a+ shareable n = liftDerived1 (shareable n)+ default shareable ::+ FromDerived1 (Letable letName) repr =>+ letName -> repr a -> repr a++-- * Class 'MakeLetName'+class MakeLetName letName where+ makeLetName :: SharingName -> IO letName++-- ** Type 'ShowLetName'+-- | Useful on golden unit tests because 'StableName'+-- change often when changing unrelated source code+-- or even changing basic GHC or executable flags.+class ShowLetName (showName::Bool) letName where+ showLetName :: letName -> String+-- | Like 'Show'.+instance Show letName => ShowLetName 'True letName where+ showLetName = show+-- | Always return @"<hidden>"@,+instance ShowLetName 'False letName where+ showLetName _p = "<hidden>"++-- * Type 'SharingName'+-- | Note that the observable sharing enabled by 'StableName'+-- is not perfect as it will not observe all the sharing explicitely done.+--+-- Note also that the observed sharing could be different between ghc and ghci.+data SharingName = forall a. SharingName (StableName a)+-- | @('makeSharingName' x)@ is like @('makeStableName' x)@ but it also forces+-- evaluation of @(x)@ to ensure that the 'StableName' is correct first time,+-- which avoids to produce a tree bigger than needed.+--+-- Note that this function uses 'unsafePerformIO' instead of returning in 'IO',+-- this is apparently required to avoid infinite loops due to unstable 'StableName'+-- in compiled code, and sometimes also in ghci.+--+-- Note that maybe [pseq should be used here](https://gitlab.haskell.org/ghc/ghc/-/issues/2916).+makeSharingName :: a -> SharingName+makeSharingName !x = SharingName $ unsafePerformIO $ makeStableName x++instance Eq SharingName where+ SharingName x == SharingName y = eqStableName x y+instance Hashable SharingName where+ hash (SharingName n) = hashStableName n+ hashWithSalt salt (SharingName n) = hashWithSalt salt n+{-+instance Show SharingName where+ showsPrec _ (SharingName n) = showHex (I# (unsafeCoerce# n))+-}++-- * Type 'ObserveSharing'+newtype ObserveSharing letName repr a = ObserveSharing { unObserveSharing ::+ MT.ReaderT (HashSet SharingName)+ (MT.State (ObserveSharingState letName))+ (FinalizeSharing letName repr a) }++-- | Interpreter detecting some (Haskell embedded) @let@ definitions used at+-- least once and/or recursively, in order to replace them+-- with the 'shareable' and 'ref' combinators.+-- See [Type-safe observable sharing in Haskell](https://doi.org/10.1145/1596638.1596653)+--+-- Beware not to apply 'observeSharing' more than once on the same term+-- otherwise some 'shareable' introduced by the first call+-- would be removed by the second call.+observeSharing ::+ Eq letName =>+ Hashable letName =>+ Show letName =>+ ObserveSharing letName repr a ->+ WithSharing letName repr a+observeSharing (ObserveSharing m) =+ let (fs, st) = MT.runReaderT m mempty `MT.runState`+ ObserveSharingState+ { oss_refs = HM.empty+ , oss_recs = HS.empty+ } in+ let refs = HS.fromList $+ (`foldMap` oss_refs st) $ (\(letName, refCount) ->+ if refCount > 0 then [letName] else []) in+ --trace (show refs) $+ MT.runWriter $+ (`MT.runReaderT` refs) $+ unFinalizeSharing fs++-- ** Type 'SomeLet'+data SomeLet repr = forall a. SomeLet (repr a)++-- ** Type 'WithSharing'+type WithSharing letName repr a =+ (repr a, HM.HashMap letName (SomeLet repr))+{-+-- * Type 'WithSharing'+data WithSharing letName repr a = WithSharing+ { lets :: HM.HashMap letName (SomeLet repr)+ , body :: repr a+ }+mapWithSharing ::+ (forall v. repr v -> repr v) ->+ WithSharing letName repr a ->+ WithSharing letName repr a+mapWithSharing f ws = WithSharing+ { lets = (\(SomeLet repr) -> SomeLet (f repr)) <$> lets ws+ , body = f (body ws)+ }+-}++-- ** Type 'ObserveSharingState'+data ObserveSharingState letName = ObserveSharingState+ { oss_refs :: HashMap SharingName (letName, Int)+ , oss_recs :: HashSet SharingName+ -- ^ TODO: unused so far, will it be useful somewhere at a later stage?+ }++observeSharingNode ::+ Eq letName =>+ Hashable letName =>+ Show letName =>+ Letable letName repr =>+ MakeLetName letName =>+ ObserveSharing letName repr a ->+ ObserveSharing letName repr a+observeSharingNode (ObserveSharing m) = ObserveSharing $ do+ let nodeName = makeSharingName m+ st <- MT.lift MT.get+ ((letName, before), preds) <- getCompose $ HM.alterF (\before ->+ Compose $ case before of+ Nothing -> do+ let letName = unsafePerformIO $ makeLetName nodeName+ return ((letName, before), Just (letName, 0))+ Just (letName, refCount) -> do+ return ((letName, before), Just (letName, refCount + 1))+ ) nodeName (oss_refs st)+ parentNames <- MT.ask+ if nodeName `HS.member` parentNames+ then do+ MT.lift $ MT.put st+ { oss_refs = preds+ , oss_recs = HS.insert nodeName (oss_recs st)+ }+ return $ ref True letName+ else do+ MT.lift $ MT.put st{ oss_refs = preds }+ if isNothing before+ then MT.local (HS.insert nodeName) (shareable letName <$> m)+ else return $ ref False letName++type instance Derived (ObserveSharing letName repr) = FinalizeSharing letName repr+instance+ ( Letable letName repr+ , MakeLetName letName+ , Eq letName+ , Hashable letName+ , Show letName+ ) => LiftDerived (ObserveSharing letName repr) where+ liftDerived = observeSharingNode . ObserveSharing . return+instance+ ( Letable letName repr+ , MakeLetName letName+ , Eq letName+ , Hashable letName+ , Show letName+ ) => LiftDerived1 (ObserveSharing letName repr) where+ liftDerived1 f x = observeSharingNode $ ObserveSharing $+ f <$> unObserveSharing x+instance+ ( Letable letName repr+ , MakeLetName letName+ , Eq letName+ , Hashable letName+ , Show letName+ ) => LiftDerived2 (ObserveSharing letName repr) where+ liftDerived2 f x y = observeSharingNode $ ObserveSharing $+ f <$> unObserveSharing x+ <*> unObserveSharing y+instance+ ( Letable letName repr+ , MakeLetName letName+ , Eq letName+ , Hashable letName+ , Show letName+ ) => LiftDerived3 (ObserveSharing letName repr) where+ liftDerived3 f x y z = observeSharingNode $ ObserveSharing $+ f <$> unObserveSharing x+ <*> unObserveSharing y+ <*> unObserveSharing z+instance Letable letName (ObserveSharing letName repr) where+ shareable = error "[BUG]: observeSharing MUST NOT be applied twice"+ ref = error "[BUG]: observeSharing MUST NOT be applied twice"+instance Letsable letName (ObserveSharing letName repr) where+ lets = error "[BUG]: observeSharing MUST NOT be applied twice"++-- * Type 'FinalizeSharing'+-- | Remove 'shareable' when non-recursive or unused+-- or replace it by 'ref', moving 'shareable's to the top.+newtype FinalizeSharing letName repr a = FinalizeSharing { unFinalizeSharing ::+ MT.ReaderT (HS.HashSet letName)+ (MT.Writer (LetBindings letName repr))+ (repr a) }++-- ** Type 'LetBindings'+type LetBindings letName repr = HM.HashMap letName (SomeLet repr)++type instance Derived (FinalizeSharing _letName repr) = repr+instance+ ( Eq letName+ , Hashable letName+ ) => LiftDerived (FinalizeSharing letName repr) where+ liftDerived = FinalizeSharing . pure+instance+ ( Eq letName+ , Hashable letName+ ) => LiftDerived1 (FinalizeSharing letName repr) where+ liftDerived1 f x = FinalizeSharing $ f <$> unFinalizeSharing x+instance+ ( Eq letName+ , Hashable letName+ ) => LiftDerived2 (FinalizeSharing letName repr) where+ liftDerived2 f x y = FinalizeSharing $+ f <$> unFinalizeSharing x+ <*> unFinalizeSharing y+instance+ ( Eq letName+ , Hashable letName+ ) => LiftDerived3 (FinalizeSharing letName repr) where+ liftDerived3 f x y z = FinalizeSharing $+ f <$> unFinalizeSharing x+ <*> unFinalizeSharing y+ <*> unFinalizeSharing z+instance+ ( Letable letName repr+ , Eq letName+ , Hashable letName+ , Show letName+ ) => Letable letName (FinalizeSharing letName repr) where+ shareable name x = FinalizeSharing $ do+ refs <- MT.ask+ if name `HS.member` refs+ -- This 'shareable' is 'ref'erenced, move it into the result,+ -- to put it in scope even when some 'ref' to it exists outside of 'x'+ -- (which can happen when a sub-expression is shared),+ -- and replace it by a 'ref'.+ then do+ let (repr, defs) = MT.runWriter $ MT.runReaderT (unFinalizeSharing x) refs+ MT.lift $ MT.tell $ HM.insert name (SomeLet repr) defs+ return $ ref False name+ -- Remove 'shareable'.+ else+ unFinalizeSharing x++-- * Class 'Letsable'+class Letsable letName repr where+ -- | @('lets' defs x)@ let-binds @(defs)@ in @(x)@.+ lets :: LetBindings letName repr -> repr a -> repr a+ lets defs = liftDerived1 (lets ((\(SomeLet val) -> SomeLet (derive val)) <$> defs))+ default lets ::+ Derivable repr =>+ FromDerived1 (Letsable letName) repr =>+ LetBindings letName repr -> repr a -> repr a+{-+-- | Not used but can be written nonetheless.+instance+ ( Letsable letName repr+ , Eq letName+ , Hashable letName+ , Show letName+ ) => Letsable letName (FinalizeSharing letName repr) where+ lets defs x = FinalizeSharing $ do+ ds <- traverse (\(SomeLet v) -> do+ r <- unFinalizeSharing v+ return (SomeLet r)+ ) defs+ MT.lift $ MT.tell ds+ unFinalizeSharing x+-}
+ src/Symantic/Typed/Optimize.hs view
@@ -0,0 +1,41 @@+module Symantic.Typed.Optimize where++import Data.Bool (Bool)+import qualified Data.Function as Fun++import Symantic.Typed.Lang+import Symantic.Typed.Data++-- | Beta-reduce the left-most outer-most lambda abstraction (aka. normal-order reduction),+-- but to avoid duplication of work, only those manually marked+-- as using their variable at most once.+--+-- DOC: Demonstrating Lambda Calculus Reduction, Peter Sestoft, 2001,+-- https://www.itu.dk/people/sestoft/papers/sestoft-lamreduce.pdf+normalOrderReduction :: forall repr a.+ Abstractable repr =>+ IfThenElseable repr =>+ SomeData repr a -> SomeData repr a+normalOrderReduction = nor+ where+ -- | normal-order reduction+ nor :: SomeData repr b -> SomeData repr b+ nor = \case+ Data (Lam f) -> lam (nor Fun.. f)+ Data (Lam1 f) -> lam1 (nor Fun.. f)+ Data (x :@ y) -> case whnf x of+ Data (Lam1 f) -> nor (f y)+ x' -> nor x' .@ nor y+ Data (IfThenElse test ok ko) ->+ case nor test of+ Data (Constant b :: Data (Constantable Bool) repr Bool) ->+ if b then nor ok else nor ko+ t -> ifThenElse (nor t) (nor ok) (nor ko)+ x -> x+ -- | weak-head normal-form+ whnf :: SomeData repr b -> SomeData repr b+ whnf = \case+ Data (x :@ y) -> case whnf x of+ Data (Lam1 f) -> whnf (f y)+ x' -> x' .@ y+ x -> x
+ src/Symantic/Typed/Reify.hs view
@@ -0,0 +1,68 @@+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -Wno-incomplete-patterns #-} -- For reifyTH+-- | Reify an Haskell value using type-directed normalisation-by-evaluation (NBE).+module Symantic.Typed.Reify where++import Control.Monad (Monad(..))+import qualified Data.Function as Fun+import qualified Language.Haskell.TH as TH++import Symantic.Typed.Lang (Abstractable(..))++-- | 'ReifyReflect' witnesses the duality between @meta@ and @(repr a)@.+-- It indicates which type variables in @a@ are not to be instantiated+-- with the arrow type, and instantiates them to @(repr _)@ in @meta@.+-- This is directly taken from: http://okmij.org/ftp/tagless-final/course/TDPE.hs+--+-- * @meta@ instantiates polymorphic types of the original Haskell expression+-- with @(repr _)@ types, according to how 'ReifyReflect' is constructed+-- using 'base' and @('-->')@. This is obviously not possible+-- if the orignal expression uses monomorphic types (like 'Int'),+-- but remains possible with constrained polymorphic types (like @(Num i => i)@),+-- because @(i)@ can still be inferred to @(repr _)@,+-- whereas the finally chosen @(repr)@+-- (eg. 'E', or 'Identity', or 'TH.CodeQ', or ...)+-- can have a 'Num' instance.+-- * @(repr a)@ is the symantic type as it would have been,+-- had the expression been written with explicit 'lam's+-- instead of bare haskell functions.+-- DOC: http://okmij.org/ftp/tagless-final/cookbook.html#TDPE+-- DOC: http://okmij.org/ftp/tagless-final/NBE.html+-- DOC: https://www.dicosmo.org/Articles/2004-BalatDiCosmoFiore-Popl.pdf+data ReifyReflect repr meta a = ReifyReflect+ { -- | 'reflect' converts from a *represented* Haskell term of type @a@+ -- to an object *representing* that value of type @a@.+ reify :: meta -> repr a+ -- | 'reflect' converts back an object *representing* a value of type @a@,+ -- to the *represented* Haskell term of type @a@.+ , reflect :: repr a -> meta+ }++-- | The base of induction : placeholder for a type which is not the arrow type.+base :: ReifyReflect repr (repr a) a+base = ReifyReflect{reify = Fun.id, reflect = Fun.id}++-- | The inductive case : the arrow type.+-- 'reify' and 'reflect' are built together inductively.+infixr 8 -->+(-->) :: Abstractable repr =>+ ReifyReflect repr m1 o1 -> ReifyReflect repr m2 o2 ->+ ReifyReflect repr (m1 -> m2) (o1 -> o2)+r1 --> r2 = ReifyReflect+ { reify = \meta -> lam (reify r2 Fun.. meta Fun.. reflect r1)+ , reflect = \repr -> reflect r2 Fun.. (.@) repr Fun.. reify r1+ }++-- * Using TemplateHaskell to fully auto-generate 'ReifyReflect'++-- | @$(reifyTH 'Foo.bar)@ calls 'reify' on 'Foo.bar'+-- with an 'ReifyReflect' generated from the infered type of 'Foo.bar'.+reifyTH :: TH.Name -> TH.Q TH.Exp+reifyTH name = do+ info <- TH.reify name+ case info of+ TH.VarI n (TH.ForallT _vs _ctx ty) _dec ->+ [| reify $(genReifyReflect ty) $(return (TH.VarE n)) |]+ where+ genReifyReflect (TH.AppT (TH.AppT TH.ArrowT a) b) = [| $(genReifyReflect a) --> $(genReifyReflect b) |]+ genReifyReflect TH.VarT{} = [| base |]
+ src/Symantic/Typed/View.hs view
@@ -0,0 +1,116 @@+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE ImplicitPrelude #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE UndecidableInstances #-} -- For Show (SomeData a)+module Symantic.Typed.View where++import Data.Int (Int)+import Data.String+import Text.Show+import qualified Data.Function as Fun+import qualified Prelude++import Symantic.Typed.Fixity+import Symantic.Typed.Lang+import Symantic.Typed.Data+import Symantic.Typed.Derive++data View a where+ View :: (ViewEnv -> ShowS) -> View a+ ViewUnifix :: Unifix -> String -> String -> View (a -> b)+ ViewInfix :: Infix -> String -> String -> View (a -> b -> c)+ ViewApp :: View (b -> a) -> View b -> View a++runView :: View a -> ViewEnv -> ShowS+runView (View v) env = v env+runView (ViewInfix _op name _infixName) _env = showString name+runView (ViewUnifix _op name _unifixName) _env = showString name+runView (ViewApp f x) env =+ pairView env op Fun.$+ runView f env{viewEnv_op = (op, SideL) } Fun..+ showString " " Fun..+ runView x env{viewEnv_op = (op, SideR) }+ where op = infixN 10++-- | Unusual, but enables to leverage default definition of methods.+type instance Derived View = View+instance LiftDerived View where+ liftDerived = Fun.id++instance IsString (View a) where+ fromString s = View Fun.$ \_env -> showString s+instance Show (View a) where+ showsPrec p = (`runView` ViewEnv+ { viewEnv_op = (infixN p, SideL)+ , viewEnv_pair = pairParen+ , viewEnv_lamDepth = 1+ })+instance Show (SomeData View a) where+ showsPrec p (SomeData x) = showsPrec p (derive x :: View a)++data ViewEnv+ = ViewEnv+ { viewEnv_op :: (Infix, Side)+ , viewEnv_pair :: Pair+ , viewEnv_lamDepth :: Int+ }++pairView :: ViewEnv -> Infix -> ShowS -> ShowS+pairView env op s =+ if isPairNeeded (viewEnv_op env) op+ then showString o Fun.. s Fun.. showString c+ else s+ where (o,c) = viewEnv_pair env++instance Abstractable View where+ var = Fun.id+ lam f = viewLam "x" f+ lam1 f = viewLam "u" f+ ViewInfix op _name infixName .@ ViewApp x y = View Fun.$ \env ->+ pairView env op Fun.$+ runView x env{viewEnv_op=(op, SideL)} Fun..+ showString " " Fun.. showString infixName Fun.. showString " " Fun..+ runView y env{viewEnv_op=(op, SideR)}+ ViewInfix op name _infixName .@ x = View Fun.$ \env ->+ showParen Prelude.True Fun.$+ runView x env{viewEnv_op=(op, SideL)} Fun..+ showString " " Fun.. showString name+ f .@ x = ViewApp f x+viewLam :: String -> (View a -> View b) -> View (a -> b)+viewLam varPrefix f = View Fun.$ \env ->+ pairView env op Fun.$+ let x = showString varPrefix Fun..+ showsPrec 0 (viewEnv_lamDepth env) in+ -- showString "Lam1 (" .+ showString "\\" Fun.. x Fun.. showString " -> " Fun..+ runView (f (View (\_env -> x))) env+ { viewEnv_op = (op, SideL)+ , viewEnv_lamDepth = Prelude.succ (viewEnv_lamDepth env)+ }+ -- . showString ")"+ where+ op = infixN 0+instance Anythingable View+instance Bottomable View where+ bottom = "<hidden>"+instance Show c => Constantable c View where+ constant c = View Fun.$ \_env -> shows c+instance Eitherable View where+ left = "Left"+ right = "Right"+instance Equalable View where+ equal = ViewInfix (infixN 4) "(==)" "=="+instance Listable View where+ cons = ViewInfix (infixR 5) "(:)" ":"+ nil = "[]"+instance Maybeable View where+ nothing = "Nothing"+ just = "Just"
− stack.yaml
@@ -1,1 +0,0 @@-resolver: lts-15.4
− stack.yaml.lock
@@ -1,12 +0,0 @@-# This file was autogenerated by Stack.-# You should not edit this file by hand.-# For more information, please see the documentation at:-# https://docs.haskellstack.org/en/stable/lock_files--packages: []-snapshots:-- completed:- size: 491163- url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/15/4.yaml- sha256: bc60043a06b58902b533baa80fb566c0ec495c41e428bc0f8c1e8c15b2a4c468- original: lts-15.4
symantic-base.cabal view
@@ -1,43 +1,93 @@+cabal-version: 3.0+license: AGPL-3.0-or-later name: symantic-base -- PVP: +-+------- breaking API changes -- | | +----- non-breaking API additions -- | | | +--- code changes with no API change-version: 0.0.2.20200708+version: 0.1.0.20210703 category: Data Structures-synopsis: Basic symantics for writing Embedded Domain-Specific Languages (EDSL).-description: A collection of basic tagless-final combinators.-extra-doc-files:-license: GPL-3-license-file: COPYING+synopsis: Commonly useful symantics for Embedded Domain-Specific Languages (EDSL)+description:+ This is a work-in-progress collection of basic tagless-final combinators,+ along with some advanced utilities to exploit them.++ * @Symantic.Typed@+ is for combinators indexed by a single type.+ * @Symantic.Dityped@+ is for combinators indexed by an extensible function type,+ used for typed formatting, enabling type safe dual interpreters à la printf and scanf.+ Inspired by Oleg Kiselyov's [PrintScanF.hs](http://okmij.org/ftp/tagless-final/course/PrintScanF.hs).+ For an example, see [symantic-http](https://hackage.haskell.org/package/symantic-http).+ * @Symantic.{Typed,Dityped}.Lang@+ gather commonly used tagless-final combinators+ (the syntax part of symantics).+ * @Symantic.Typed.Data@ is an interpreter enabling to pattern-match on combinators,+ while keeping their extensibility.+ * @Symantic.{Typed,Dityped}.Derive@+ enable to give a default value to combinators which avoids boilerplate code+ when implementing combinators for an interpreter is factorizable.+ * @Symantic.Typed.ObserveSharing@+ enables to observe Haskell @let@ definitions,+ turning infinite values into finite ones,+ which is useful to inspect and optimize recursive grammars for example.+ Inspired by Andy Gill's [Type-safe observable sharing in Haskell](https://doi.org/10.1145/1596638.1596653).+ For an example, see [symantic-parser](https://hackage.haskell.org/package/symantic-parser).+ * @Symantic.Typed.Reify@+ enables the lifting to any interpreter+ of any Haskell functions taking as arguments+ only polymorphic types (possibly constrained)+ or functions using such types.+ Inspired by Oleg Kiselyov's [TDPE.hs](http://okmij.org/ftp/tagless-final/course/TDPE.hs).+ * @Symantic.Typed.View@+ is an interpreter enabling to turn combinators into a human-readable string.+ * @Symantic.Dityped.ADT@+ enables to define formats à la printf-scanf+ using data-constructors instead of @Either@s of tuples.+ For an example, see [symantic-atom](https://hackage.haskell.org/package/symantic-atom).+ * @Symantic.Dityped.CurryN@+ gather utilities for currying or uncurrying tuples+ of size greater or equal to 2.+ * @Symantic.Typed.Fixity@+ gathers utilities for parsing or viewing+ infix, prefix and postfix combinators. stability: experimental-author: Julien Moutinho <julm+symantic-base@sourcephile.fr>-maintainer: Julien Moutinho <julm+symantic-base@sourcephile.fr>-bug-reports: Julien Moutinho <julm+symantic-base@sourcephile.fr>--- homepage:+author: Julien Moutinho <julm+symantic-base@sourcephile.fr>+maintainer: Julien Moutinho <julm+symantic-base@sourcephile.fr>+bug-reports: https://mails.sourcephile.fr/inbox/symantic-base+copyright: Julien Moutinho <julm+symantic-base@sourcephile.fr> build-type: Simple-cabal-version: 1.24-tested-with: GHC==8.8.3+tested-with: GHC==8.10.4 extra-source-files:- stack.yaml- stack.yaml.lock+ cabal.project+ default.nix+ .envrc+ flake.lock+ flake.nix+ Makefile extra-tmp-files: -Source-Repository head+source-repository head+ type: git location: git://git.sourcephile.fr/haskell/symantic-base- type: git -Library+library hs-source-dirs: src exposed-modules:- Symantic.Base- Symantic.Base.ADT- Symantic.Base.Algebrable- Symantic.Base.Composable- Symantic.Base.CurryN- Symantic.Base.Fixity- Symantic.Base.Permutable- Symantic.Base.Routable+ Symantic.Dityped+ Symantic.Dityped.ADT+ Symantic.Dityped.CurryN+ Symantic.Dityped.Derive+ Symantic.Dityped.Lang+ Symantic.Typed+ Symantic.Typed.Data+ Symantic.Typed.Derive+ Symantic.Typed.Fixity+ Symantic.Typed.Lang+ Symantic.Typed.ObserveSharing+ Symantic.Typed.Optimize+ Symantic.Typed.Reify+ Symantic.Typed.View default-language: Haskell2010 default-extensions: DefaultSignatures@@ -58,6 +108,12 @@ -Wall -Wincomplete-uni-patterns -Wincomplete-record-updates- -- -fhide-source-paths+ -Wpartial-fields+ -fprint-potential-instances build-depends:- base >= 4.10 && < 5+ base >= 4.10 && < 5,+ containers,+ hashable,+ template-haskell,+ transformers,+ unordered-containers