{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_HADDOCK ignore-exports #-}
module Data.Tree.BST.Extern.Lookup
  ( Lookupable (lookup),
  )
where
import Data.Kind (Type)
import Data.Proxy (Proxy (Proxy))
import Data.Tree.BST.Utils (LookupValueType, Member)
import Data.Tree.ITree (ITree (ForkITree), Tree (ForkTree))
import Data.Tree.Node (Node, getValue)
import GHC.TypeNats (CmpNat, Nat)
import Prelude (Bool (True), Ordering (EQ, GT, LT))
class Lookupable (x :: Nat) (a :: Type) (t :: Tree) where
  
  lookup ::
    (t ~ 'ForkTree l (Node n a1) r, Member x t t ~ 'True) =>
    Proxy x ->
    ITree t ->
    a
instance
  ( t ~ 'ForkTree l (Node n a1) r,
    a ~ LookupValueType x t t,
    o ~ CmpNat x n,
    Lookupable' x a ('ForkTree l (Node n a1) r) o
  ) =>
  Lookupable x a ('ForkTree l (Node n a1) r)
  where
  lookup :: forall (l :: Tree) (n :: Nat) a1 (r :: Tree).
('ForkTree l (Node n a1) r ~ 'ForkTree l (Node n a1) r,
 Member x ('ForkTree l (Node n a1) r) ('ForkTree l (Node n a1) r)
 ~ 'True) =>
Proxy x -> ITree ('ForkTree l (Node n a1) r) -> a
lookup Proxy x
x ITree ('ForkTree l (Node n a1) r)
t = Proxy x -> ITree ('ForkTree l (Node n a1) r) -> Proxy o -> a
forall (x :: Nat) a (t :: Tree) (o :: Ordering).
Lookupable' x a t o =>
Proxy x -> ITree t -> Proxy o -> a
lookup' Proxy x
x ITree ('ForkTree l (Node n a1) r)
t (Proxy o
forall {k} (t :: k). Proxy t
Proxy :: Proxy o)
class Lookupable' (x :: Nat) (a :: Type) (t :: Tree) (o :: Ordering) where
  lookup' :: Proxy x -> ITree t -> Proxy o -> a
instance Lookupable' x a ('ForkTree l (Node n a) r) 'EQ where
  lookup' :: Proxy x -> ITree ('ForkTree l (Node n a) r) -> Proxy 'EQ -> a
lookup' Proxy x
_ (ForkITree ITree l
_ Node n a
node ITree r
_) Proxy 'EQ
_ = Node n a -> a
forall (k :: Nat) a. Node k a -> a
getValue Node n a
node
instance
  ( l ~ 'ForkTree ll (Node ln lna) lr,
    o ~ CmpNat x ln,
    Lookupable' x a l o
  ) =>
  Lookupable' x a ('ForkTree ('ForkTree ll (Node ln lna) lr) (Node n a1) r) 'LT
  where
  lookup' :: Proxy x
-> ITree ('ForkTree ('ForkTree ll (Node ln lna) lr) (Node n a1) r)
-> Proxy 'LT
-> a
lookup' Proxy x
p (ForkITree ITree l
l Node n a
_ ITree r
_) Proxy 'LT
_ = Proxy x -> ITree l -> Proxy o -> a
forall (x :: Nat) a (t :: Tree) (o :: Ordering).
Lookupable' x a t o =>
Proxy x -> ITree t -> Proxy o -> a
lookup' Proxy x
p ITree l
l (Proxy o
forall {k} (t :: k). Proxy t
Proxy :: Proxy o)
instance
  ( r ~ 'ForkTree rl (Node rn rna) rr,
    o ~ CmpNat x rn,
    Lookupable' x a ('ForkTree rl (Node rn rna) rr) o
  ) =>
  Lookupable' x a ('ForkTree l (Node n a1) ('ForkTree rl (Node rn rna) rr)) 'GT
  where
  lookup' :: Proxy x
-> ITree ('ForkTree l (Node n a1) ('ForkTree rl (Node rn rna) rr))
-> Proxy 'GT
-> a
lookup' Proxy x
p (ForkITree ITree l
_ Node n a
_ ITree r
r) Proxy 'GT
_ = Proxy x -> ITree r -> Proxy o -> a
forall (x :: Nat) a (t :: Tree) (o :: Ordering).
Lookupable' x a t o =>
Proxy x -> ITree t -> Proxy o -> a
lookup' Proxy x
p ITree r
r (Proxy o
forall {k} (t :: k). Proxy t
Proxy :: Proxy o)