git.iko.soy/rowtype-yoga/purescript-native
on fd82591 help sign in
72 lines 1.7 kB history raw
1-----------------------------------------------------------------------------
2--
3-- Module : Language.PureScript.Kinds
4-- Copyright : (c) Phil Freeman 2013
5-- License : MIT
6--
7-- Maintainer : Phil Freeman <paf31@cantab.net>
8-- Stability : experimental
9-- Portability :
10--
11-- |
12--
13-----------------------------------------------------------------------------
15{-# LANGUAGE DeriveDataTypeable #-}
16{-# LANGUAGE TemplateHaskell #-}
18module Language.PureScript.Kinds where
20import Data.Data
21import qualified Data.Aeson.TH as A
23import Control.Applicative
24import Control.Monad.Unify (Unknown)
26-- |
27-- The data type of kinds
28--
29data Kind
30 -- |
31 -- Unification variable of type Kind
32 --
33 = KUnknown Unknown
34 -- |
35 -- The kind of types
36 --
37 | Star
38 -- |
39 -- The kind of effects
40 --
41 | Bang
42 -- |
43 -- Kinds for labelled, unordered rows without duplicates
44 --
45 | Row Kind
46 -- |
47 -- Function kinds
48 --
49 | FunKind Kind Kind deriving (Show, Eq, Ord, Data, Typeable)
51$(A.deriveJSON A.defaultOptions ''Kind)
53everywhereOnKinds :: (Kind -> Kind) -> Kind -> Kind
54everywhereOnKinds f = go
55 where
56 go (Row k1) = f (Row (go k1))
57 go (FunKind k1 k2) = f (FunKind (go k1) (go k2))
58 go other = f other
60everywhereOnKindsM :: (Functor m, Applicative m, Monad m) => (Kind -> m Kind) -> Kind -> m Kind
61everywhereOnKindsM f = go
62 where
63 go (Row k1) = (Row <$> go k1) >>= f
64 go (FunKind k1 k2) = (FunKind <$> go k1 <*> go k2) >>= f
65 go other = f other
67everythingOnKinds :: (r -> r -> r) -> (Kind -> r) -> Kind -> r
68everythingOnKinds (<>) f = go
69 where
70 go k@(Row k1) = f k <> go k1
71 go k@(FunKind k1 k2) = f k <> go k1 <> go k2
72 go other = f other