Skip to content

Commit

Permalink
Create data-backed types: List, Pair, Map
Browse files Browse the repository at this point in the history
Signed-off-by: Ana Pantilie <ana.pantilie95@gmail.com>
  • Loading branch information
ana-pantilie committed Mar 27, 2024
1 parent 8f66cd7 commit 55bcd18
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 37 deletions.
2 changes: 2 additions & 0 deletions plutus-tx/plutus-tx.cabal
Expand Up @@ -73,6 +73,8 @@ library
PlutusTx.Code
PlutusTx.Coverage
PlutusTx.DataList
PlutusTx.DataMap
PlutusTx.DataPair
PlutusTx.Either
PlutusTx.Enum
PlutusTx.Eq
Expand Down
46 changes: 9 additions & 37 deletions plutus-tx/src/PlutusTx/DataList.hs
Expand Up @@ -6,15 +6,11 @@
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ViewPatterns #-}

module PlutusTx.DataList (

) where
module PlutusTx.DataList where

import PlutusTx.AsData qualified as AsData
import PlutusTx.IsData qualified as P
import PlutusTx.Prelude hiding (map)

import GHC.Exts qualified as H
import PlutusTx.Prelude qualified as Prelude

AsData.asData
[d|
Expand All @@ -24,36 +20,12 @@ AsData.asData

type DataElem a = (P.UnsafeFromData a, P.ToData a)

instance (DataElem a) => H.IsList (List a) where
type Item (List a) = a
fromList [] = Nil
fromList (x : xs) =
Cons x (H.fromList xs)
toList Nil = []
toList (Cons x xs) = x : H.toList xs

(.:) :: (DataElem a) => a -> List a -> List a
(.:) = Cons

-- empty List is overloaded as []

-- examples of using overloaded syntax

example0 :: DataElem a => List a
example0 = []

example1 :: List Bool
example1 = [True, False]

example2 :: List Integer
example2 = [1..10]
fromList :: DataElem a => [a] -> List a
fromList = Prelude.foldr Cons Nil

-- examples of using overloaded pattern matching
isSingleton :: DataElem a => List a -> Bool
isSingleton [_] = True
isSingleton _ = False
foldr :: DataElem a => (a -> b -> b) -> b -> List a -> b
foldr _ u Nil = u
foldr f u (Cons x xs) = f x (foldr f u xs)

map :: (DataElem a, DataElem b) => (a -> b) -> List a -> List b
map _ [] = []
-- unfortunately matching on ':' doesn't work
map f (H.toList -> x : xs) = f x .: map f (H.fromList xs)
toList :: DataElem a => List a -> [a]
toList = foldr (:) []
17 changes: 17 additions & 0 deletions plutus-tx/src/PlutusTx/DataMap.hs
@@ -0,0 +1,17 @@
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE ViewPatterns #-}

module PlutusTx.DataMap where

import PlutusTx.AsData qualified as AsData
import PlutusTx.DataList
import PlutusTx.DataPair
import PlutusTx.IsData qualified as P

AsData.asData
[d|
data Map k v = Map (List (Pair k v))
deriving newtype (P.ToData, P.FromData, P.UnsafeFromData)
|]
16 changes: 16 additions & 0 deletions plutus-tx/src/PlutusTx/DataPair.hs
@@ -0,0 +1,16 @@
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE ViewPatterns #-}

module PlutusTx.DataPair where

import PlutusTx.AsData qualified as AsData
import PlutusTx.IsData qualified as P
import PlutusTx.Prelude qualified as Prelude

AsData.asData
[d|
data Pair a b = Pair a b
deriving newtype (P.ToData, P.FromData, P.UnsafeFromData)
|]

0 comments on commit 55bcd18

Please sign in to comment.