-- SPDX-FileCopyrightText: 2021 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

-- | Michelson view.
module Morley.Michelson.Untyped.View
  ( ViewName (ViewName, ..)
  , mkViewName
  , BadViewNameError (..)
  , isValidViewNameChar
  , viewNameMaxLength
  , renderViewName
  , viewNameToMText

  , View' (..)
  , ViewsSet (..)
  , mkViewsSet
  , VS.ViewsSetError (..)

  -- * Manipulation
  , emptyViewsSet
  , addViewToSet
  , lookupView
  , viewsSetNames
  ) where

import Data.Aeson (FromJSON, ToJSON)
import Data.Aeson.TH (deriveJSON)
import Data.Coerce (coerce)
import Data.Data (Data)
import Data.Default (Default)

import Morley.Michelson.Internal.ViewName
import Morley.Michelson.Internal.ViewsSet qualified as VS
import Morley.Michelson.Untyped.Type
import Morley.Util.Aeson

-- | Untyped view in a contract.
data View' op = View
  { forall op. View' op -> ViewName
viewName :: ViewName
    -- ^ View name
  , forall op. View' op -> Ty
viewArgument :: Ty
    -- ^ View argument type
  , forall op. View' op -> Ty
viewReturn :: Ty
    -- ^ View return type
  , forall op. View' op -> op
viewCode :: op
    -- ^ View code
  } deriving stock (View' op -> View' op -> Bool
(View' op -> View' op -> Bool)
-> (View' op -> View' op -> Bool) -> Eq (View' op)
forall op. Eq op => View' op -> View' op -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall op. Eq op => View' op -> View' op -> Bool
== :: View' op -> View' op -> Bool
$c/= :: forall op. Eq op => View' op -> View' op -> Bool
/= :: View' op -> View' op -> Bool
Eq, Int -> View' op -> ShowS
[View' op] -> ShowS
View' op -> String
(Int -> View' op -> ShowS)
-> (View' op -> String) -> ([View' op] -> ShowS) -> Show (View' op)
forall op. Show op => Int -> View' op -> ShowS
forall op. Show op => [View' op] -> ShowS
forall op. Show op => View' op -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall op. Show op => Int -> View' op -> ShowS
showsPrec :: Int -> View' op -> ShowS
$cshow :: forall op. Show op => View' op -> String
show :: View' op -> String
$cshowList :: forall op. Show op => [View' op] -> ShowS
showList :: [View' op] -> ShowS
Show, (forall a b. (a -> b) -> View' a -> View' b)
-> (forall a b. a -> View' b -> View' a) -> Functor View'
forall a b. a -> View' b -> View' a
forall a b. (a -> b) -> View' a -> View' b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> View' a -> View' b
fmap :: forall a b. (a -> b) -> View' a -> View' b
$c<$ :: forall a b. a -> View' b -> View' a
<$ :: forall a b. a -> View' b -> View' a
Functor, Typeable (View' op)
Typeable (View' op)
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> View' op -> c (View' op))
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c (View' op))
-> (View' op -> Constr)
-> (View' op -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c (View' op)))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c (View' op)))
-> ((forall b. Data b => b -> b) -> View' op -> View' op)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> View' op -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> View' op -> r)
-> (forall u. (forall d. Data d => d -> u) -> View' op -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> View' op -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> View' op -> m (View' op))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> View' op -> m (View' op))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> View' op -> m (View' op))
-> Data (View' op)
View' op -> Constr
View' op -> DataType
(forall b. Data b => b -> b) -> View' op -> View' op
forall {op}. Data op => Typeable (View' op)
forall op. Data op => View' op -> Constr
forall op. Data op => View' op -> DataType
forall op.
Data op =>
(forall b. Data b => b -> b) -> View' op -> View' op
forall op u.
Data op =>
Int -> (forall d. Data d => d -> u) -> View' op -> u
forall op u.
Data op =>
(forall d. Data d => d -> u) -> View' op -> [u]
forall op r r'.
Data op =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> View' op -> r
forall op r r'.
Data op =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> View' op -> r
forall op (m :: * -> *).
(Data op, Monad m) =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
forall op (m :: * -> *).
(Data op, MonadPlus m) =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
forall op (c :: * -> *).
Data op =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (View' op)
forall op (c :: * -> *).
Data op =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> View' op -> c (View' op)
forall op (t :: * -> *) (c :: * -> *).
(Data op, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (View' op))
forall op (t :: * -> * -> *) (c :: * -> *).
(Data op, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (View' op))
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> View' op -> u
forall u. (forall d. Data d => d -> u) -> View' op -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> View' op -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> View' op -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (View' op)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> View' op -> c (View' op)
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (View' op))
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (View' op))
$cgfoldl :: forall op (c :: * -> *).
Data op =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> View' op -> c (View' op)
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> View' op -> c (View' op)
$cgunfold :: forall op (c :: * -> *).
Data op =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (View' op)
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (View' op)
$ctoConstr :: forall op. Data op => View' op -> Constr
toConstr :: View' op -> Constr
$cdataTypeOf :: forall op. Data op => View' op -> DataType
dataTypeOf :: View' op -> DataType
$cdataCast1 :: forall op (t :: * -> *) (c :: * -> *).
(Data op, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (View' op))
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (View' op))
$cdataCast2 :: forall op (t :: * -> * -> *) (c :: * -> *).
(Data op, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (View' op))
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (View' op))
$cgmapT :: forall op.
Data op =>
(forall b. Data b => b -> b) -> View' op -> View' op
gmapT :: (forall b. Data b => b -> b) -> View' op -> View' op
$cgmapQl :: forall op r r'.
Data op =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> View' op -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> View' op -> r
$cgmapQr :: forall op r r'.
Data op =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> View' op -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> View' op -> r
$cgmapQ :: forall op u.
Data op =>
(forall d. Data d => d -> u) -> View' op -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> View' op -> [u]
$cgmapQi :: forall op u.
Data op =>
Int -> (forall d. Data d => d -> u) -> View' op -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> View' op -> u
$cgmapM :: forall op (m :: * -> *).
(Data op, Monad m) =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
$cgmapMp :: forall op (m :: * -> *).
(Data op, MonadPlus m) =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
$cgmapMo :: forall op (m :: * -> *).
(Data op, MonadPlus m) =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
Data, (forall x. View' op -> Rep (View' op) x)
-> (forall x. Rep (View' op) x -> View' op) -> Generic (View' op)
forall x. Rep (View' op) x -> View' op
forall x. View' op -> Rep (View' op) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall op x. Rep (View' op) x -> View' op
forall op x. View' op -> Rep (View' op) x
$cfrom :: forall op x. View' op -> Rep (View' op) x
from :: forall x. View' op -> Rep (View' op) x
$cto :: forall op x. Rep (View' op) x -> View' op
to :: forall x. Rep (View' op) x -> View' op
Generic)

instance NFData op => NFData (View' op)

deriveJSON morleyAesonOptions ''View'

newtype ViewsSet instr = ViewsSet { forall instr. ViewsSet instr -> Map ViewName (View' instr)
unViewsSet :: Map ViewName (View' instr) }
  deriving newtype (Value -> Parser [ViewsSet instr]
Value -> Parser (ViewsSet instr)
(Value -> Parser (ViewsSet instr))
-> (Value -> Parser [ViewsSet instr]) -> FromJSON (ViewsSet instr)
forall instr. FromJSON instr => Value -> Parser [ViewsSet instr]
forall instr. FromJSON instr => Value -> Parser (ViewsSet instr)
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: forall instr. FromJSON instr => Value -> Parser (ViewsSet instr)
parseJSON :: Value -> Parser (ViewsSet instr)
$cparseJSONList :: forall instr. FromJSON instr => Value -> Parser [ViewsSet instr]
parseJSONList :: Value -> Parser [ViewsSet instr]
FromJSON, [ViewsSet instr] -> Value
[ViewsSet instr] -> Encoding
ViewsSet instr -> Value
ViewsSet instr -> Encoding
(ViewsSet instr -> Value)
-> (ViewsSet instr -> Encoding)
-> ([ViewsSet instr] -> Value)
-> ([ViewsSet instr] -> Encoding)
-> ToJSON (ViewsSet instr)
forall instr. ToJSON instr => [ViewsSet instr] -> Value
forall instr. ToJSON instr => [ViewsSet instr] -> Encoding
forall instr. ToJSON instr => ViewsSet instr -> Value
forall instr. ToJSON instr => ViewsSet instr -> Encoding
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: forall instr. ToJSON instr => ViewsSet instr -> Value
toJSON :: ViewsSet instr -> Value
$ctoEncoding :: forall instr. ToJSON instr => ViewsSet instr -> Encoding
toEncoding :: ViewsSet instr -> Encoding
$ctoJSONList :: forall instr. ToJSON instr => [ViewsSet instr] -> Value
toJSONList :: [ViewsSet instr] -> Value
$ctoEncodingList :: forall instr. ToJSON instr => [ViewsSet instr] -> Encoding
toEncodingList :: [ViewsSet instr] -> Encoding
ToJSON, ViewsSet instr
ViewsSet instr -> Default (ViewsSet instr)
forall instr. ViewsSet instr
forall a. a -> Default a
$cdef :: forall instr. ViewsSet instr
def :: ViewsSet instr
Default, ViewsSet instr -> ()
(ViewsSet instr -> ()) -> NFData (ViewsSet instr)
forall instr. NFData instr => ViewsSet instr -> ()
forall a. (a -> ()) -> NFData a
$crnf :: forall instr. NFData instr => ViewsSet instr -> ()
rnf :: ViewsSet instr -> ()
NFData, Eq (Element (ViewsSet instr)) =>
Element (ViewsSet instr) -> ViewsSet instr -> Bool
Ord (Element (ViewsSet instr)) =>
ViewsSet instr -> Maybe (Element (ViewsSet instr))
Monoid (Element (ViewsSet instr)) =>
ViewsSet instr -> Element (ViewsSet instr)
(Element (ViewsSet instr) ~ Bool) => ViewsSet instr -> Bool
ViewsSet instr -> Bool
ViewsSet instr -> Int
ViewsSet instr -> [Element (ViewsSet instr)]
ViewsSet instr -> Maybe (Element (ViewsSet instr))
(Element (ViewsSet instr) -> Bool) -> ViewsSet instr -> Bool
(Element (ViewsSet instr) -> Bool)
-> ViewsSet instr -> Maybe (Element (ViewsSet instr))
(Element (ViewsSet instr)
 -> Element (ViewsSet instr) -> Element (ViewsSet instr))
-> ViewsSet instr -> Maybe (Element (ViewsSet instr))
(ViewsSet instr -> [Element (ViewsSet instr)])
-> (ViewsSet instr -> Bool)
-> (forall b.
    (Element (ViewsSet instr) -> b -> b) -> b -> ViewsSet instr -> b)
-> (forall b.
    (b -> Element (ViewsSet instr) -> b) -> b -> ViewsSet instr -> b)
-> (forall b.
    (b -> Element (ViewsSet instr) -> b) -> b -> ViewsSet instr -> b)
-> (ViewsSet instr -> Int)
-> (Eq (Element (ViewsSet instr)) =>
    Element (ViewsSet instr) -> ViewsSet instr -> Bool)
-> (forall m.
    Monoid m =>
    (Element (ViewsSet instr) -> m) -> ViewsSet instr -> m)
-> (Monoid (Element (ViewsSet instr)) =>
    ViewsSet instr -> Element (ViewsSet instr))
-> (forall b.
    (Element (ViewsSet instr) -> b -> b) -> b -> ViewsSet instr -> b)
-> (Eq (Element (ViewsSet instr)) =>
    Element (ViewsSet instr) -> ViewsSet instr -> Bool)
-> ((Element (ViewsSet instr) -> Bool) -> ViewsSet instr -> Bool)
-> ((Element (ViewsSet instr) -> Bool) -> ViewsSet instr -> Bool)
-> ((Element (ViewsSet instr) ~ Bool) => ViewsSet instr -> Bool)
-> ((Element (ViewsSet instr) ~ Bool) => ViewsSet instr -> Bool)
-> ((Element (ViewsSet instr) -> Bool)
    -> ViewsSet instr -> Maybe (Element (ViewsSet instr)))
-> (ViewsSet instr -> Maybe (Element (ViewsSet instr)))
-> (Ord (Element (ViewsSet instr)) =>
    ViewsSet instr -> Maybe (Element (ViewsSet instr)))
-> (Ord (Element (ViewsSet instr)) =>
    ViewsSet instr -> Maybe (Element (ViewsSet instr)))
-> ((Element (ViewsSet instr)
     -> Element (ViewsSet instr) -> Element (ViewsSet instr))
    -> ViewsSet instr -> Maybe (Element (ViewsSet instr)))
-> ((Element (ViewsSet instr)
     -> Element (ViewsSet instr) -> Element (ViewsSet instr))
    -> ViewsSet instr -> Maybe (Element (ViewsSet instr)))
-> Container (ViewsSet instr)
forall instr.
Eq (Element (ViewsSet instr)) =>
Element (ViewsSet instr) -> ViewsSet instr -> Bool
forall instr.
Ord (Element (ViewsSet instr)) =>
ViewsSet instr -> Maybe (Element (ViewsSet instr))
forall m.
Monoid m =>
(Element (ViewsSet instr) -> m) -> ViewsSet instr -> m
forall instr.
Monoid (Element (ViewsSet instr)) =>
ViewsSet instr -> Element (ViewsSet instr)
forall instr.
(Element (ViewsSet instr) ~ Bool) =>
ViewsSet instr -> Bool
forall instr. ViewsSet instr -> Bool
forall instr. ViewsSet instr -> Int
forall instr. ViewsSet instr -> [Element (ViewsSet instr)]
forall instr. ViewsSet instr -> Maybe (Element (ViewsSet instr))
forall t.
(t -> [Element t])
-> (t -> Bool)
-> (forall b. (Element t -> b -> b) -> b -> t -> b)
-> (forall b. (b -> Element t -> b) -> b -> t -> b)
-> (forall b. (b -> Element t -> b) -> b -> t -> b)
-> (t -> Int)
-> (Eq (Element t) => Element t -> t -> Bool)
-> (forall m. Monoid m => (Element t -> m) -> t -> m)
-> (Monoid (Element t) => t -> Element t)
-> (forall b. (Element t -> b -> b) -> b -> t -> b)
-> (Eq (Element t) => Element t -> t -> Bool)
-> ((Element t -> Bool) -> t -> Bool)
-> ((Element t -> Bool) -> t -> Bool)
-> ((Element t ~ Bool) => t -> Bool)
-> ((Element t ~ Bool) => t -> Bool)
-> ((Element t -> Bool) -> t -> Maybe (Element t))
-> (t -> Maybe (Element t))
-> (Ord (Element t) => t -> Maybe (Element t))
-> (Ord (Element t) => t -> Maybe (Element t))
-> ((Element t -> Element t -> Element t)
    -> t -> Maybe (Element t))
-> ((Element t -> Element t -> Element t)
    -> t -> Maybe (Element t))
-> Container t
forall b.
(b -> Element (ViewsSet instr) -> b) -> b -> ViewsSet instr -> b
forall instr.
(Element (ViewsSet instr) -> Bool) -> ViewsSet instr -> Bool
forall instr.
(Element (ViewsSet instr) -> Bool)
-> ViewsSet instr -> Maybe (Element (ViewsSet instr))
forall instr.
(Element (ViewsSet instr)
 -> Element (ViewsSet instr) -> Element (ViewsSet instr))
-> ViewsSet instr -> Maybe (Element (ViewsSet instr))
forall b.
(Element (ViewsSet instr) -> b -> b) -> b -> ViewsSet instr -> b
forall instr m.
Monoid m =>
(Element (ViewsSet instr) -> m) -> ViewsSet instr -> m
forall instr b.
(b -> Element (ViewsSet instr) -> b) -> b -> ViewsSet instr -> b
forall instr b.
(Element (ViewsSet instr) -> b -> b) -> b -> ViewsSet instr -> b
$ctoList :: forall instr. ViewsSet instr -> [Element (ViewsSet instr)]
toList :: ViewsSet instr -> [Element (ViewsSet instr)]
$cnull :: forall instr. ViewsSet instr -> Bool
null :: ViewsSet instr -> Bool
$cfoldr :: forall instr b.
(Element (ViewsSet instr) -> b -> b) -> b -> ViewsSet instr -> b
foldr :: forall b.
(Element (ViewsSet instr) -> b -> b) -> b -> ViewsSet instr -> b
$cfoldl :: forall instr b.
(b -> Element (ViewsSet instr) -> b) -> b -> ViewsSet instr -> b
foldl :: forall b.
(b -> Element (ViewsSet instr) -> b) -> b -> ViewsSet instr -> b
$cfoldl' :: forall instr b.
(b -> Element (ViewsSet instr) -> b) -> b -> ViewsSet instr -> b
foldl' :: forall b.
(b -> Element (ViewsSet instr) -> b) -> b -> ViewsSet instr -> b
$clength :: forall instr. ViewsSet instr -> Int
length :: ViewsSet instr -> Int
$celem :: forall instr.
Eq (Element (ViewsSet instr)) =>
Element (ViewsSet instr) -> ViewsSet instr -> Bool
elem :: Eq (Element (ViewsSet instr)) =>
Element (ViewsSet instr) -> ViewsSet instr -> Bool
$cfoldMap :: forall instr m.
Monoid m =>
(Element (ViewsSet instr) -> m) -> ViewsSet instr -> m
foldMap :: forall m.
Monoid m =>
(Element (ViewsSet instr) -> m) -> ViewsSet instr -> m
$cfold :: forall instr.
Monoid (Element (ViewsSet instr)) =>
ViewsSet instr -> Element (ViewsSet instr)
fold :: Monoid (Element (ViewsSet instr)) =>
ViewsSet instr -> Element (ViewsSet instr)
$cfoldr' :: forall instr b.
(Element (ViewsSet instr) -> b -> b) -> b -> ViewsSet instr -> b
foldr' :: forall b.
(Element (ViewsSet instr) -> b -> b) -> b -> ViewsSet instr -> b
$cnotElem :: forall instr.
Eq (Element (ViewsSet instr)) =>
Element (ViewsSet instr) -> ViewsSet instr -> Bool
notElem :: Eq (Element (ViewsSet instr)) =>
Element (ViewsSet instr) -> ViewsSet instr -> Bool
$call :: forall instr.
(Element (ViewsSet instr) -> Bool) -> ViewsSet instr -> Bool
all :: (Element (ViewsSet instr) -> Bool) -> ViewsSet instr -> Bool
$cany :: forall instr.
(Element (ViewsSet instr) -> Bool) -> ViewsSet instr -> Bool
any :: (Element (ViewsSet instr) -> Bool) -> ViewsSet instr -> Bool
$cand :: forall instr.
(Element (ViewsSet instr) ~ Bool) =>
ViewsSet instr -> Bool
and :: (Element (ViewsSet instr) ~ Bool) => ViewsSet instr -> Bool
$cor :: forall instr.
(Element (ViewsSet instr) ~ Bool) =>
ViewsSet instr -> Bool
or :: (Element (ViewsSet instr) ~ Bool) => ViewsSet instr -> Bool
$cfind :: forall instr.
(Element (ViewsSet instr) -> Bool)
-> ViewsSet instr -> Maybe (Element (ViewsSet instr))
find :: (Element (ViewsSet instr) -> Bool)
-> ViewsSet instr -> Maybe (Element (ViewsSet instr))
$csafeHead :: forall instr. ViewsSet instr -> Maybe (Element (ViewsSet instr))
safeHead :: ViewsSet instr -> Maybe (Element (ViewsSet instr))
$csafeMaximum :: forall instr.
Ord (Element (ViewsSet instr)) =>
ViewsSet instr -> Maybe (Element (ViewsSet instr))
safeMaximum :: Ord (Element (ViewsSet instr)) =>
ViewsSet instr -> Maybe (Element (ViewsSet instr))
$csafeMinimum :: forall instr.
Ord (Element (ViewsSet instr)) =>
ViewsSet instr -> Maybe (Element (ViewsSet instr))
safeMinimum :: Ord (Element (ViewsSet instr)) =>
ViewsSet instr -> Maybe (Element (ViewsSet instr))
$csafeFoldr1 :: forall instr.
(Element (ViewsSet instr)
 -> Element (ViewsSet instr) -> Element (ViewsSet instr))
-> ViewsSet instr -> Maybe (Element (ViewsSet instr))
safeFoldr1 :: (Element (ViewsSet instr)
 -> Element (ViewsSet instr) -> Element (ViewsSet instr))
-> ViewsSet instr -> Maybe (Element (ViewsSet instr))
$csafeFoldl1 :: forall instr.
(Element (ViewsSet instr)
 -> Element (ViewsSet instr) -> Element (ViewsSet instr))
-> ViewsSet instr -> Maybe (Element (ViewsSet instr))
safeFoldl1 :: (Element (ViewsSet instr)
 -> Element (ViewsSet instr) -> Element (ViewsSet instr))
-> ViewsSet instr -> Maybe (Element (ViewsSet instr))
Container)
  deriving stock (ViewsSet instr -> ViewsSet instr -> Bool
(ViewsSet instr -> ViewsSet instr -> Bool)
-> (ViewsSet instr -> ViewsSet instr -> Bool)
-> Eq (ViewsSet instr)
forall instr. Eq instr => ViewsSet instr -> ViewsSet instr -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall instr. Eq instr => ViewsSet instr -> ViewsSet instr -> Bool
== :: ViewsSet instr -> ViewsSet instr -> Bool
$c/= :: forall instr. Eq instr => ViewsSet instr -> ViewsSet instr -> Bool
/= :: ViewsSet instr -> ViewsSet instr -> Bool
Eq, Int -> ViewsSet instr -> ShowS
[ViewsSet instr] -> ShowS
ViewsSet instr -> String
(Int -> ViewsSet instr -> ShowS)
-> (ViewsSet instr -> String)
-> ([ViewsSet instr] -> ShowS)
-> Show (ViewsSet instr)
forall instr. Show instr => Int -> ViewsSet instr -> ShowS
forall instr. Show instr => [ViewsSet instr] -> ShowS
forall instr. Show instr => ViewsSet instr -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall instr. Show instr => Int -> ViewsSet instr -> ShowS
showsPrec :: Int -> ViewsSet instr -> ShowS
$cshow :: forall instr. Show instr => ViewsSet instr -> String
show :: ViewsSet instr -> String
$cshowList :: forall instr. Show instr => [ViewsSet instr] -> ShowS
showList :: [ViewsSet instr] -> ShowS
Show, Typeable (ViewsSet instr)
Typeable (ViewsSet instr)
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> ViewsSet instr -> c (ViewsSet instr))
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c (ViewsSet instr))
-> (ViewsSet instr -> Constr)
-> (ViewsSet instr -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c (ViewsSet instr)))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c (ViewsSet instr)))
-> ((forall b. Data b => b -> b)
    -> ViewsSet instr -> ViewsSet instr)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> ViewsSet instr -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> ViewsSet instr -> r)
-> (forall u.
    (forall d. Data d => d -> u) -> ViewsSet instr -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> ViewsSet instr -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d)
    -> ViewsSet instr -> m (ViewsSet instr))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> ViewsSet instr -> m (ViewsSet instr))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> ViewsSet instr -> m (ViewsSet instr))
-> Data (ViewsSet instr)
ViewsSet instr -> Constr
ViewsSet instr -> DataType
(forall b. Data b => b -> b) -> ViewsSet instr -> ViewsSet instr
forall {instr}. Data instr => Typeable (ViewsSet instr)
forall instr. Data instr => ViewsSet instr -> Constr
forall instr. Data instr => ViewsSet instr -> DataType
forall instr.
Data instr =>
(forall b. Data b => b -> b) -> ViewsSet instr -> ViewsSet instr
forall instr u.
Data instr =>
Int -> (forall d. Data d => d -> u) -> ViewsSet instr -> u
forall instr u.
Data instr =>
(forall d. Data d => d -> u) -> ViewsSet instr -> [u]
forall instr r r'.
Data instr =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ViewsSet instr -> r
forall instr r r'.
Data instr =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ViewsSet instr -> r
forall instr (m :: * -> *).
(Data instr, Monad m) =>
(forall d. Data d => d -> m d)
-> ViewsSet instr -> m (ViewsSet instr)
forall instr (m :: * -> *).
(Data instr, MonadPlus m) =>
(forall d. Data d => d -> m d)
-> ViewsSet instr -> m (ViewsSet instr)
forall instr (c :: * -> *).
Data instr =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (ViewsSet instr)
forall instr (c :: * -> *).
Data instr =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ViewsSet instr -> c (ViewsSet instr)
forall instr (t :: * -> *) (c :: * -> *).
(Data instr, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (ViewsSet instr))
forall instr (t :: * -> * -> *) (c :: * -> *).
(Data instr, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (ViewsSet instr))
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u.
Int -> (forall d. Data d => d -> u) -> ViewsSet instr -> u
forall u. (forall d. Data d => d -> u) -> ViewsSet instr -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ViewsSet instr -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ViewsSet instr -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> ViewsSet instr -> m (ViewsSet instr)
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> ViewsSet instr -> m (ViewsSet instr)
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (ViewsSet instr)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ViewsSet instr -> c (ViewsSet instr)
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (ViewsSet instr))
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (ViewsSet instr))
$cgfoldl :: forall instr (c :: * -> *).
Data instr =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ViewsSet instr -> c (ViewsSet instr)
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ViewsSet instr -> c (ViewsSet instr)
$cgunfold :: forall instr (c :: * -> *).
Data instr =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (ViewsSet instr)
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (ViewsSet instr)
$ctoConstr :: forall instr. Data instr => ViewsSet instr -> Constr
toConstr :: ViewsSet instr -> Constr
$cdataTypeOf :: forall instr. Data instr => ViewsSet instr -> DataType
dataTypeOf :: ViewsSet instr -> DataType
$cdataCast1 :: forall instr (t :: * -> *) (c :: * -> *).
(Data instr, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (ViewsSet instr))
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (ViewsSet instr))
$cdataCast2 :: forall instr (t :: * -> * -> *) (c :: * -> *).
(Data instr, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (ViewsSet instr))
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (ViewsSet instr))
$cgmapT :: forall instr.
Data instr =>
(forall b. Data b => b -> b) -> ViewsSet instr -> ViewsSet instr
gmapT :: (forall b. Data b => b -> b) -> ViewsSet instr -> ViewsSet instr
$cgmapQl :: forall instr r r'.
Data instr =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ViewsSet instr -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ViewsSet instr -> r
$cgmapQr :: forall instr r r'.
Data instr =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ViewsSet instr -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ViewsSet instr -> r
$cgmapQ :: forall instr u.
Data instr =>
(forall d. Data d => d -> u) -> ViewsSet instr -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> ViewsSet instr -> [u]
$cgmapQi :: forall instr u.
Data instr =>
Int -> (forall d. Data d => d -> u) -> ViewsSet instr -> u
gmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> ViewsSet instr -> u
$cgmapM :: forall instr (m :: * -> *).
(Data instr, Monad m) =>
(forall d. Data d => d -> m d)
-> ViewsSet instr -> m (ViewsSet instr)
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> ViewsSet instr -> m (ViewsSet instr)
$cgmapMp :: forall instr (m :: * -> *).
(Data instr, MonadPlus m) =>
(forall d. Data d => d -> m d)
-> ViewsSet instr -> m (ViewsSet instr)
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> ViewsSet instr -> m (ViewsSet instr)
$cgmapMo :: forall instr (m :: * -> *).
(Data instr, MonadPlus m) =>
(forall d. Data d => d -> m d)
-> ViewsSet instr -> m (ViewsSet instr)
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> ViewsSet instr -> m (ViewsSet instr)
Data, (forall a b. (a -> b) -> ViewsSet a -> ViewsSet b)
-> (forall a b. a -> ViewsSet b -> ViewsSet a) -> Functor ViewsSet
forall a b. a -> ViewsSet b -> ViewsSet a
forall a b. (a -> b) -> ViewsSet a -> ViewsSet b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> ViewsSet a -> ViewsSet b
fmap :: forall a b. (a -> b) -> ViewsSet a -> ViewsSet b
$c<$ :: forall a b. a -> ViewsSet b -> ViewsSet a
<$ :: forall a b. a -> ViewsSet b -> ViewsSet a
Functor)

mkViewsSet :: [View' instr] -> Either VS.ViewsSetError (ViewsSet instr)
mkViewsSet :: forall instr.
[View' instr] -> Either ViewsSetError (ViewsSet instr)
mkViewsSet = Either ViewsSetError (ViewsSetF (View' instr))
-> Either ViewsSetError (ViewsSet instr)
forall a b. Coercible a b => a -> b
coerce (Either ViewsSetError (ViewsSetF (View' instr))
 -> Either ViewsSetError (ViewsSet instr))
-> ([View' instr]
    -> Either ViewsSetError (ViewsSetF (View' instr)))
-> [View' instr]
-> Either ViewsSetError (ViewsSet instr)
forall a b c. SuperComposition a b c => a -> b -> c
... (View' instr -> ViewName)
-> [View' instr] -> Either ViewsSetError (ViewsSetF (View' instr))
forall a.
(a -> ViewName) -> [a] -> Either ViewsSetError (ViewsSetF a)
VS.mkViewsSet View' instr -> ViewName
forall op. View' op -> ViewName
viewName

emptyViewsSet :: forall instr. ViewsSet instr
emptyViewsSet :: forall instr. ViewsSet instr
emptyViewsSet = ViewsSetF (View' instr) -> ViewsSet instr
forall a b. Coercible a b => a -> b
coerce (ViewsSetF (View' instr) -> ViewsSet instr)
-> ViewsSetF (View' instr) -> ViewsSet instr
forall a b. (a -> b) -> a -> b
$ forall a. ViewsSetF a
VS.emptyViewsSet @(View' instr)

addViewToSet :: View' instr -> ViewsSet instr -> Either VS.ViewsSetError (ViewsSet instr)
addViewToSet :: forall instr.
View' instr
-> ViewsSet instr -> Either ViewsSetError (ViewsSet instr)
addViewToSet View' instr
x = (ViewsSetF (View' instr)
 -> Either ViewsSetError (ViewsSetF (View' instr)))
-> ViewsSet instr -> Either ViewsSetError (ViewsSet instr)
forall a b. Coercible a b => a -> b
coerce ((ViewsSetF (View' instr)
  -> Either ViewsSetError (ViewsSetF (View' instr)))
 -> ViewsSet instr -> Either ViewsSetError (ViewsSet instr))
-> (ViewsSetF (View' instr)
    -> Either ViewsSetError (ViewsSetF (View' instr)))
-> ViewsSet instr
-> Either ViewsSetError (ViewsSet instr)
forall a b. (a -> b) -> a -> b
$ (View' instr -> ViewName)
-> View' instr
-> ViewsSetF (View' instr)
-> Either ViewsSetError (ViewsSetF (View' instr))
forall a.
(a -> ViewName)
-> a -> ViewsSetF a -> Either ViewsSetError (ViewsSetF a)
VS.addViewToSet View' instr -> ViewName
forall op. View' op -> ViewName
viewName View' instr
x

lookupView :: forall instr. ViewName -> ViewsSet instr -> Maybe (View' instr)
lookupView :: forall instr. ViewName -> ViewsSet instr -> Maybe (View' instr)
lookupView = (ViewsSetF (View' instr) -> Maybe (View' instr))
-> ViewsSet instr -> Maybe (View' instr)
forall a b. Coercible a b => a -> b
coerce ((ViewsSetF (View' instr) -> Maybe (View' instr))
 -> ViewsSet instr -> Maybe (View' instr))
-> (ViewName -> ViewsSetF (View' instr) -> Maybe (View' instr))
-> ViewName
-> ViewsSet instr
-> Maybe (View' instr)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ViewName -> ViewsSetF a -> Maybe a
VS.lookupView @(View' instr)

viewsSetNames :: forall instr. ViewsSet instr -> Set ViewName
viewsSetNames :: forall instr. ViewsSet instr -> Set ViewName
viewsSetNames = forall a. ViewsSetF a -> Set ViewName
VS.viewsSetNames @(View' instr) (ViewsSetF (View' instr) -> Set ViewName)
-> (ViewsSet instr -> ViewsSetF (View' instr))
-> ViewsSet instr
-> Set ViewName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ViewsSet instr -> ViewsSetF (View' instr)
forall a b. Coercible a b => a -> b
coerce