{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE RankNTypes #-}
module Miso.Binding
(
Binding (..)
, Precedence (..)
, (<-->)
, (<<-->)
, (<-->>)
, (<--)
, (-->)
, (<--->)
, (<<--->)
, (<--->>)
, (<---)
, (--->)
) where
import Data.Functor.Const (Const(..))
import Control.Monad.Identity (Identity(..))
import Miso.Lens (Lens, Lens', LensCore(..))
data Binding parent child
= forall field . ParentToChild (parent -> field) (field -> child -> child)
| forall field . ChildToParent (field -> parent -> parent) (child -> field)
| forall field . Bidirectional Precedence (parent -> field) (field -> parent -> parent) (child -> field) (field -> child -> child)
data Precedence = Child | Parent
deriving (Precedence -> Precedence -> Bool
(Precedence -> Precedence -> Bool)
-> (Precedence -> Precedence -> Bool) -> Eq Precedence
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Precedence -> Precedence -> Bool
== :: Precedence -> Precedence -> Bool
$c/= :: Precedence -> Precedence -> Bool
/= :: Precedence -> Precedence -> Bool
Eq, Int -> Precedence -> ShowS
[Precedence] -> ShowS
Precedence -> String
(Int -> Precedence -> ShowS)
-> (Precedence -> String)
-> ([Precedence] -> ShowS)
-> Show Precedence
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Precedence -> ShowS
showsPrec :: Int -> Precedence -> ShowS
$cshow :: Precedence -> String
show :: Precedence -> String
$cshowList :: [Precedence] -> ShowS
showList :: [Precedence] -> ShowS
Show)
infixr 0 -->
(-->) :: Lens parent a -> Lens model a -> Binding parent model
Lens parent a
parent --> :: forall parent a model.
Lens parent a -> Lens model a -> Binding parent model
--> Lens model a
child = (parent -> a) -> (a -> model -> model) -> Binding parent model
forall parent child field.
(parent -> field)
-> (field -> child -> child) -> Binding parent child
ParentToChild (Lens parent a -> parent -> a
forall field record. LensCore field record -> record -> field
_get Lens parent a
parent) (Lens model a -> a -> model -> model
forall field record.
LensCore field record -> field -> record -> record
_set Lens model a
child)
infixl 0 <--
(<--) :: Lens parent a -> Lens model a -> Binding parent model
Lens parent a
parent <-- :: forall parent a model.
Lens parent a -> Lens model a -> Binding parent model
<-- Lens model a
child = (a -> parent -> parent) -> (model -> a) -> Binding parent model
forall parent child field.
(field -> parent -> parent)
-> (child -> field) -> Binding parent child
ChildToParent (Lens parent a -> a -> parent -> parent
forall field record.
LensCore field record -> field -> record -> record
_set Lens parent a
parent) (Lens model a -> model -> a
forall field record. LensCore field record -> record -> field
_get Lens model a
child)
infix 0 <-->
(<-->) :: Lens parent field -> Lens child field -> Binding parent child
Lens parent field
p <--> :: forall parent a model.
Lens parent a -> Lens model a -> Binding parent model
<--> Lens child field
c = Precedence
-> (parent -> field)
-> (field -> parent -> parent)
-> (child -> field)
-> (field -> child -> child)
-> Binding parent child
forall parent child field.
Precedence
-> (parent -> field)
-> (field -> parent -> parent)
-> (child -> field)
-> (field -> child -> child)
-> Binding parent child
Bidirectional Precedence
Parent (Lens parent field -> parent -> field
forall field record. LensCore field record -> record -> field
_get Lens parent field
p) (Lens parent field -> field -> parent -> parent
forall field record.
LensCore field record -> field -> record -> record
_set Lens parent field
p) (Lens child field -> child -> field
forall field record. LensCore field record -> record -> field
_get Lens child field
c) (Lens child field -> field -> child -> child
forall field record.
LensCore field record -> field -> record -> record
_set Lens child field
c)
infix 0 <--->
(<--->) :: Lens' parent field -> Lens' child field -> Binding parent child
Lens' parent field
p <---> :: forall parent field child.
Lens' parent field -> Lens' child field -> Binding parent child
<---> Lens' child field
c = Precedence
-> (parent -> field)
-> (field -> parent -> parent)
-> (child -> field)
-> (field -> child -> child)
-> Binding parent child
forall parent child field.
Precedence
-> (parent -> field)
-> (field -> parent -> parent)
-> (child -> field)
-> (field -> child -> child)
-> Binding parent child
Bidirectional Precedence
Parent (((field -> Const field field) -> parent -> Const field parent)
-> parent -> field
forall {a} {b} {t} {a} {b}.
((a -> Const a b) -> t -> Const a b) -> t -> a
get_ (field -> Const field field) -> parent -> Const field parent
Lens' parent field
p) (((field -> Identity field) -> parent -> Identity parent)
-> field -> parent -> parent
forall {t} {a} {a} {c}.
((t -> Identity a) -> a -> Identity c) -> a -> a -> c
set_ (field -> Identity field) -> parent -> Identity parent
Lens' parent field
p) (((field -> Const field field) -> child -> Const field child)
-> child -> field
forall {a} {b} {t} {a} {b}.
((a -> Const a b) -> t -> Const a b) -> t -> a
get_ (field -> Const field field) -> child -> Const field child
Lens' child field
c) (((field -> Identity field) -> child -> Identity child)
-> field -> child -> child
forall {t} {a} {a} {c}.
((t -> Identity a) -> a -> Identity c) -> a -> a -> c
set_ (field -> Identity field) -> child -> Identity child
Lens' child field
c)
where
get_ :: ((a -> Const a b) -> t -> Const a b) -> t -> a
get_ (a -> Const a b) -> t -> Const a b
lens_ t
record = Const a b -> a
forall {k} a (b :: k). Const a b -> a
getConst ((a -> Const a b) -> t -> Const a b
lens_ a -> Const a b
forall {k} a (b :: k). a -> Const a b
Const t
record)
set_ :: ((t -> Identity a) -> a -> Identity c) -> a -> a -> c
set_ (t -> Identity a) -> a -> Identity c
lens_ a
field = Identity c -> c
forall a. Identity a -> a
runIdentity (Identity c -> c) -> (a -> Identity c) -> a -> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (t -> Identity a) -> a -> Identity c
lens_ (\t
_ -> a -> Identity a
forall a. a -> Identity a
Identity a
field)
(<--->>)
:: Lens' parent field
-> Lens' child field
-> Binding parent child
Lens' parent field
l <--->> :: forall parent field child.
Lens' parent field -> Lens' child field -> Binding parent child
<--->> Lens' child field
r =
case (field -> f field) -> parent -> f parent
Lens' parent field
l Lens' parent field -> Lens' child field -> Binding parent child
forall parent field child.
Lens' parent field -> Lens' child field -> Binding parent child
<---> (field -> f field) -> child -> f child
Lens' child field
r of
Bidirectional Precedence
_ parent -> field
w field -> parent -> parent
x child -> field
y field -> child -> child
z -> Precedence
-> (parent -> field)
-> (field -> parent -> parent)
-> (child -> field)
-> (field -> child -> child)
-> Binding parent child
forall parent child field.
Precedence
-> (parent -> field)
-> (field -> parent -> parent)
-> (child -> field)
-> (field -> child -> child)
-> Binding parent child
Bidirectional Precedence
Parent parent -> field
w field -> parent -> parent
x child -> field
y field -> child -> child
z
Binding parent child
_ -> String -> Binding parent child
forall a. HasCallStack => String -> a
error String
"impossible"
(<<--->)
:: Lens' parent field
-> Lens' child field
-> Binding parent child
Lens' parent field
l <<---> :: forall parent field child.
Lens' parent field -> Lens' child field -> Binding parent child
<<---> Lens' child field
r =
case (field -> f field) -> parent -> f parent
Lens' parent field
l Lens' parent field -> Lens' child field -> Binding parent child
forall parent field child.
Lens' parent field -> Lens' child field -> Binding parent child
<---> (field -> f field) -> child -> f child
Lens' child field
r of
Bidirectional Precedence
_ parent -> field
w field -> parent -> parent
x child -> field
y field -> child -> child
z -> Precedence
-> (parent -> field)
-> (field -> parent -> parent)
-> (child -> field)
-> (field -> child -> child)
-> Binding parent child
forall parent child field.
Precedence
-> (parent -> field)
-> (field -> parent -> parent)
-> (child -> field)
-> (field -> child -> child)
-> Binding parent child
Bidirectional Precedence
Child parent -> field
w field -> parent -> parent
x child -> field
y field -> child -> child
z
Binding parent child
_ -> String -> Binding parent child
forall a. HasCallStack => String -> a
error String
"impossible"
infixr 0 --->
(--->) :: Lens' parent field -> Lens' child field -> Binding parent child
Lens' parent field
p ---> :: forall parent field child.
Lens' parent field -> Lens' child field -> Binding parent child
---> Lens' child field
c = (parent -> field)
-> (field -> child -> child) -> Binding parent child
forall parent child field.
(parent -> field)
-> (field -> child -> child) -> Binding parent child
ParentToChild (((field -> Const field field) -> parent -> Const field parent)
-> parent -> field
forall {a} {b} {t} {a} {b}.
((a -> Const a b) -> t -> Const a b) -> t -> a
get_ (field -> Const field field) -> parent -> Const field parent
Lens' parent field
p) (((field -> Identity field) -> child -> Identity child)
-> field -> child -> child
forall {t} {a} {a} {c}.
((t -> Identity a) -> a -> Identity c) -> a -> a -> c
set_ (field -> Identity field) -> child -> Identity child
Lens' child field
c)
where
get_ :: ((a -> Const a b) -> t -> Const a b) -> t -> a
get_ (a -> Const a b) -> t -> Const a b
lens_ t
record = Const a b -> a
forall {k} a (b :: k). Const a b -> a
getConst ((a -> Const a b) -> t -> Const a b
lens_ a -> Const a b
forall {k} a (b :: k). a -> Const a b
Const t
record)
set_ :: ((t -> Identity a) -> a -> Identity c) -> a -> a -> c
set_ (t -> Identity a) -> a -> Identity c
lens_ a
field = Identity c -> c
forall a. Identity a -> a
runIdentity (Identity c -> c) -> (a -> Identity c) -> a -> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (t -> Identity a) -> a -> Identity c
lens_ (\t
_ -> a -> Identity a
forall a. a -> Identity a
Identity a
field)
(<-->>)
:: Lens parent field
-> Lens child field
-> Binding parent child
Lens parent field
l <-->> :: forall parent a model.
Lens parent a -> Lens model a -> Binding parent model
<-->> Lens child field
r =
case Lens parent field
l Lens parent field -> Lens child field -> Binding parent child
forall parent a model.
Lens parent a -> Lens model a -> Binding parent model
<--> Lens child field
r of
Bidirectional Precedence
_ parent -> field
w field -> parent -> parent
x child -> field
y field -> child -> child
z -> Precedence
-> (parent -> field)
-> (field -> parent -> parent)
-> (child -> field)
-> (field -> child -> child)
-> Binding parent child
forall parent child field.
Precedence
-> (parent -> field)
-> (field -> parent -> parent)
-> (child -> field)
-> (field -> child -> child)
-> Binding parent child
Bidirectional Precedence
Parent parent -> field
w field -> parent -> parent
x child -> field
y field -> child -> child
z
Binding parent child
_ -> String -> Binding parent child
forall a. HasCallStack => String -> a
error String
"impossible"
(<<-->)
:: Lens parent field
-> Lens child field
-> Binding parent child
Lens parent field
l <<--> :: forall parent a model.
Lens parent a -> Lens model a -> Binding parent model
<<--> Lens child field
r =
case Lens parent field
l Lens parent field -> Lens child field -> Binding parent child
forall parent a model.
Lens parent a -> Lens model a -> Binding parent model
<--> Lens child field
r of
Bidirectional Precedence
_ parent -> field
w field -> parent -> parent
x child -> field
y field -> child -> child
z -> Precedence
-> (parent -> field)
-> (field -> parent -> parent)
-> (child -> field)
-> (field -> child -> child)
-> Binding parent child
forall parent child field.
Precedence
-> (parent -> field)
-> (field -> parent -> parent)
-> (child -> field)
-> (field -> child -> child)
-> Binding parent child
Bidirectional Precedence
Child parent -> field
w field -> parent -> parent
x child -> field
y field -> child -> child
z
Binding parent child
_ -> String -> Binding parent child
forall a. HasCallStack => String -> a
error String
"impossible"
infixl 0 <---
(<---) :: Lens' parent field -> Lens' child field -> Binding parent child
Lens' parent field
p <--- :: forall parent field child.
Lens' parent field -> Lens' child field -> Binding parent child
<--- Lens' child field
c = (field -> parent -> parent)
-> (child -> field) -> Binding parent child
forall parent child field.
(field -> parent -> parent)
-> (child -> field) -> Binding parent child
ChildToParent (((field -> Identity field) -> parent -> Identity parent)
-> field -> parent -> parent
forall {t} {a} {a} {c}.
((t -> Identity a) -> a -> Identity c) -> a -> a -> c
set_ (field -> Identity field) -> parent -> Identity parent
Lens' parent field
p) (((field -> Const field field) -> child -> Const field child)
-> child -> field
forall {a} {b} {t} {a} {b}.
((a -> Const a b) -> t -> Const a b) -> t -> a
get_ (field -> Const field field) -> child -> Const field child
Lens' child field
c)
where
get_ :: ((a -> Const a b) -> t -> Const a b) -> t -> a
get_ (a -> Const a b) -> t -> Const a b
lens_ t
record = Const a b -> a
forall {k} a (b :: k). Const a b -> a
getConst ((a -> Const a b) -> t -> Const a b
lens_ a -> Const a b
forall {k} a (b :: k). a -> Const a b
Const t
record)
set_ :: ((t -> Identity a) -> a -> Identity c) -> a -> a -> c
set_ (t -> Identity a) -> a -> Identity c
lens_ a
field = Identity c -> c
forall a. Identity a -> a
runIdentity (Identity c -> c) -> (a -> Identity c) -> a -> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (t -> Identity a) -> a -> Identity c
lens_ (\t
_ -> a -> Identity a
forall a. a -> Identity a
Identity a
field)