# Prisms

A prism is an isomorphism that is total. Meaning, if JSON.parse fails, it doesn't throw an Error in our lens. Let's update our jsonISO we created in Part 8's Isomorphism from a partial iso to a total iso. We take what we learned from Part 7 on total functions and make our Isomorphism total-ish. We don't have to worry, for now, about going back (i.e. the setter JSON.stringify), just the getter (JSON.parse).

# From Partial To Total

Instead of using our existing isomorphism:

const jsonISO = iso(JSON.parse, JSON.stringify)

Instead, we'll create a new one that has basic error handling, and return null if it doesn't work:

import { simplePrism } from 'focused'

const jsonPrism = simplePrism(
    string => {
        try {
            return JSON.parse(string)
        } catch (error) {
            return null
        }
    }, 
    JSON.stringify
)

Testing it out with a good string:

const savedGameString = readFileSync('savedgame.json')
const updatedString = set(_.$(jsonPrism).saveDate, new Date(), savedGameString)

... it works the same:

{ "saveDate": "2018-11-25T23:32:41.887Z",
    "map": "overworld",
    "chapter": 3,
    ...

However, notice if you give bad JSON that would cause JSON.parse to fail:

set(_.$(jsonISOMaybe).saveDate, new Date(), '🐮')
// 🐮

... it just acts like an identity function, and gives you back the source string.