Safe Haskell | None |
---|---|
Language | GHC2021 |
Data.HTree.Labeled
Description
This module implements a search in a typelevel tree
and offers a handy interface via -XOverloaedRecordDot
and HasField
.
We can search in the tree via BFS or DFS.
Performance wise this doesn't make a difference, as the search is performed at
compile time anyway however, it can change the semantics if the tree contains an
element more than once, see the example in getElem
.
Synopsis
- newtype Labeled (l1 :: l) a = MkLabeled {
- unLabel :: a
- pattern HNodeL :: forall {l1} (l2 :: l1) a f (ts :: TyForest Type). Functor f => f a -> HForest f ts -> HTree f ('TyNode (Labeled l2 a) ts)
- pattern HLeafL :: forall {l1} (l2 :: l1) a f. Functor f => f a -> HTree f ('TyNode (Labeled l2 a) ('[] :: [TyTree Type]))
- type TyNodeL (l1 :: l) a = 'TyNode (Labeled l1 a)
- getElem :: forall {k} (t :: TyTree Type) f. forall (strat :: SearchStrategy) (l :: k) typ -> (HasField' strat (Labeled l typ) t, Functor f) => HTree f t -> f typ
- getElem' :: forall (t :: TyTree Type) f. forall (strat :: SearchStrategy) typ -> HasField' strat typ t => HTree f t -> f typ
- data SearchStrategy
- class HasField (x :: k) r a | x r -> a where
- getField :: r -> a
- class HasField' (strat :: SearchStrategy) typ (t :: TyTree Type) | strat t -> typ where
- class Decide (strat :: SearchStrategy) (elem :: Bool) typ (t :: TyTree Type) | strat t -> typ where
- type family Elem (typ :: k) (t :: TyTree k) :: Bool where ...
- type family AnyElem (typ :: k) (ts :: TyForest k) :: Bool where ...
- getElemWithPath :: forall {k} (typ :: k) (t :: TyTree k) f. Path typ t -> HTree f t -> f typ
Interface
Labeled types
newtype Labeled (l1 :: l) a Source #
a newtype that is labeled with some typelevel tag
Instances
Functor (Labeled l2) Source # | |||||
Foldable (Labeled l2) Source # | |||||
Defined in Data.HTree.Labeled Methods fold :: Monoid m => Labeled l2 m -> m # foldMap :: Monoid m => (a -> m) -> Labeled l2 a -> m # foldMap' :: Monoid m => (a -> m) -> Labeled l2 a -> m # foldr :: (a -> b -> b) -> b -> Labeled l2 a -> b # foldr' :: (a -> b -> b) -> b -> Labeled l2 a -> b # foldl :: (b -> a -> b) -> b -> Labeled l2 a -> b # foldl' :: (b -> a -> b) -> b -> Labeled l2 a -> b # foldr1 :: (a -> a -> a) -> Labeled l2 a -> a # foldl1 :: (a -> a -> a) -> Labeled l2 a -> a # toList :: Labeled l2 a -> [a] # null :: Labeled l2 a -> Bool # length :: Labeled l2 a -> Int # elem :: Eq a => a -> Labeled l2 a -> Bool # maximum :: Ord a => Labeled l2 a -> a # minimum :: Ord a => Labeled l2 a -> a # | |||||
Traversable (Labeled l2) Source # | |||||
Defined in Data.HTree.Labeled | |||||
Generic (Labeled l2 a) Source # | |||||
Defined in Data.HTree.Labeled Associated Types
| |||||
Show a => Show (Labeled l2 a) Source # | |||||
Eq a => Eq (Labeled l2 a) Source # | |||||
Ord a => Ord (Labeled l2 a) Source # | |||||
Defined in Data.HTree.Labeled | |||||
type Rep (Labeled l2 a) Source # | |||||
Defined in Data.HTree.Labeled |
pattern HNodeL :: forall {l1} (l2 :: l1) a f (ts :: TyForest Type). Functor f => f a -> HForest f ts -> HTree f ('TyNode (Labeled l2 a) ts) infixr 4 Source #
a pattern that allows for direct construction and destruction of nodes with labels
pattern HLeafL :: forall {l1} (l2 :: l1) a f. Functor f => f a -> HTree f ('TyNode (Labeled l2 a) ('[] :: [TyTree Type])) Source #
a labeled HNode Leaf
type TyNodeL (l1 :: l) a = 'TyNode (Labeled l1 a) infixr 4 Source #
a type syonym that allows for easy construction of TyTrees that have labeled nodes
Getting elements
getElem :: forall {k} (t :: TyTree Type) f. forall (strat :: SearchStrategy) (l :: k) typ -> (HasField' strat (Labeled l typ) t, Functor f) => HTree f t -> f typ Source #
searches a tree for an element and returns that element, specialised to Labeled
and unwraps
>>>
import Data.Functor.Identity
>>>
type T = TyNodeL "top" Int [ TyNodeL "inter" Int '[ TyNodeL "foo" Int '[]], TyNodeL "foo" Int '[]]
>>>
t :: HTree Identity T = 42 `HNodeL` HNodeL 4 (HNodeL 69 HNil `HCons` HNil) `HCons` HNodeL 67 HNil `HCons` HNil
>>>
getElem DFS "foo" Int t
Identity 69>>>
getElem BFS "foo" Int t
Identity 67
getElem' :: forall (t :: TyTree Type) f. forall (strat :: SearchStrategy) typ -> HasField' strat typ t => HTree f t -> f typ Source #
searches a tree for an element and returns that element
data SearchStrategy Source #
the search strategy used in HasField'
, this is intended to be used only as a DataKind
Reexports
class HasField (x :: k) r a | x r -> a where #
Constraint representing the fact that the field x
belongs to
the record type r
and has field type a
. This will be solved
automatically, but manual instances may be provided as well.
Internal
class HasField' (strat :: SearchStrategy) typ (t :: TyTree Type) | strat t -> typ where Source #
This is the helper class that creates evidence, it implements a DFS together with Decide
Instances
HasField' 'BFS typ ('TyNode typ (t ': ts)) Source # | |
HasField' 'BFS typ ('TyNode typ ('[] :: [TyTree Type])) Source # | |
Decide 'BFS (AnyElem typ ts) typ ('TyNode typ' (t ': ts)) => HasField' 'BFS typ ('TyNode typ' (t ': ts)) Source # | |
HasField' 'DFS typ ('TyNode typ (t ': ts)) Source # | |
HasField' 'DFS typ ('TyNode typ ('[] :: [TyTree Type])) Source # | |
Decide 'DFS (Not (Elem typ t)) typ ('TyNode typ' (t ': ts)) => HasField' 'DFS typ ('TyNode typ' (t ': ts)) Source # | |
class Decide (strat :: SearchStrategy) (elem :: Bool) typ (t :: TyTree Type) | strat t -> typ where Source #
Together with HasField' implements a DFS in the tree
Methods
evidence' :: forall {proxy :: forall k. k -> Type}. proxy strat -> proxy elem -> Path typ t Source #
type family Elem (typ :: k) (t :: TyTree k) :: Bool where ... Source #
simple typelevel predicate that tests whether some element is in a tree
type family AnyElem (typ :: k) (ts :: TyForest k) :: Bool where ... Source #
typelevel predicate that tests whether the element is in any of the subtrees
getElemWithPath :: forall {k} (typ :: k) (t :: TyTree k) f. Path typ t -> HTree f t -> f typ Source #
gets an element given a path into the tree