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