git.iko.soy/rowtype-yoga/purescript-native
on c9f0839 help sign in
46 lines 1.1 kB history raw
1{-# LANGUAGE TemplateHaskell #-}
3module Language.PureScript.Kinds where
5import Prelude.Compat
7import qualified Data.Aeson.TH as A
9-- | The data type of kinds
10data Kind
11 -- | Unification variable of type Kind
12 = KUnknown Int
13 -- | The kind of types
14 | Star
15 -- | The kind of effects
16 | Bang
17 -- | Kinds for labelled, unordered rows without duplicates
18 | Row Kind
19 -- | Function kinds
20 | FunKind Kind Kind
21 -- | Type-level strings
22 | Symbol
23 deriving (Show, Read, Eq, Ord)
25$(A.deriveJSON A.defaultOptions ''Kind)
27everywhereOnKinds :: (Kind -> Kind) -> Kind -> Kind
28everywhereOnKinds f = go
29 where
30 go (Row k1) = f (Row (go k1))
31 go (FunKind k1 k2) = f (FunKind (go k1) (go k2))
32 go other = f other
34everywhereOnKindsM :: Monad m => (Kind -> m Kind) -> Kind -> m Kind
35everywhereOnKindsM f = go
36 where
37 go (Row k1) = (Row <$> go k1) >>= f
38 go (FunKind k1 k2) = (FunKind <$> go k1 <*> go k2) >>= f
39 go other = f other
41everythingOnKinds :: (r -> r -> r) -> (Kind -> r) -> Kind -> r
42everythingOnKinds (<>) f = go
43 where
44 go k@(Row k1) = f k <> go k1
45 go k@(FunKind k1 k2) = f k <> go k1 <> go k2
46 go other = f other